這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
package mainimport ( "fmt" "graphics" "image" "image/png" "log" "net/http" "os" "strconv" "strings")func main() { http.HandleFunc("/", doImageHandler) http.ListenAndServe("127.0.0.1:6789", nil)}func doImageHandler(w http.ResponseWriter, r *http.Request) { fmt.Printf("%q\n", strings.Split(r.URL.Path, "/")) url := strings.Split(r.URL.Path, "/") if len(url) != 3 { return } newdx, uerr := strconv.Atoi(url[1]) if uerr != nil { log.Fatal(uerr) } src, err := LoadImage(url[2]) bound := src.Bounds() dx := bound.Dx() dy := bound.Dy() if err != nil { log.Fatal(err) } // 縮圖的大小 dst := image.NewRGBA(image.Rect(0, 0, newdx, newdx*dy/dx)) // 產生縮圖,等比例縮放 err = graphics.Scale(dst, src) if err != nil { log.Fatal(err) } header := w.Header() header.Add("Content-Type", "image/jpeg") png.Encode(w, dst)}// Load Image decodes an image from a file of image.func LoadImage(path string) (img image.Image, err error) { file, err := os.Open(path) if err != nil { return } defer file.Close() img, _, err = image.Decode(file) return}
///////////////////////////////////////////////////////////////////////
package masimport ( "code.google.com/p/graphics-go/graphics" "fmt" z "github.com/nutzam/zgo" "image")func (ma *Master) ActiveImage(pobj string) error { // 檔案絕對路徑 var path string = pobj // 保留源圖Image結構 var img image.Image // 圖片類型 typef := z.FileType(path) // 按照圖片格式載入圖片 switch typef { // JPEG case "jpeg": // ImageJPEG img = z.ImageJPEG(path) // JPG case "jpg": // ImageJPEG img = z.ImageJPEG(path) // PNG case "png": // ImagePNG img = z.ImagePNG(path) } // 判斷載入原圖片是否成功 if img == nil { // 返回錯誤 return fmt.Errorf("active image decode exception ...") } // -------------------------------------------------------- // // 擷取螢幕數量 moniSize := ma.NodeConf.MonitorSize(ma) // 擷取螢幕解析度 width := ma.NodeConf.Resolution.Width height := ma.NodeConf.Resolution.Height // 擷取素材平均值 widthMoni := img.Bounds().Dx() / moniSize.Col heightMoni := img.Bounds().Dy() / moniSize.Row // -------------------------------------------------------- // // 遍曆螢幕,切割圖片 for _, monis := range ma.NodeConf.Layout { // 遍曆節點螢幕 for _, moni := range monis { // 擷取圖片 row := moni.Display.Row col := moni.Display.Col // 產生目標背景圖 backgroundSrc := z.ImageRGBA(widthMoni, heightMoni) // 產生靶心圖表 z.ImageDrawRGBA(backgroundSrc, img, (col-1)*widthMoni, (row-1)*heightMoni) // 產生最終背景圖 background := z.ImageRGBA(width, height) // 產生最終圖 graphics.Scale(background, backgroundSrc) // 按照圖片格式儲存圖片 switch typef { // JPEG case "jpeg": // ImageEncodeJPEG z.ImageEncodeJPEG(fmt.Sprintf("%s.pic_result/%d_%d.%s", path, col, row, typef), background) // JPG case "jpg": // ImageEncodeJPEG z.ImageEncodeJPEG(fmt.Sprintf("%s.pic_result/%d_%d.%s", path, col, row, typef), background) // PNG case "png": // ImageEncodePNG z.ImageEncodePNG(fmt.Sprintf("%s.pic_result/%d_%d.%s", path, col, row, typef), background) } } } // 返回 return nil}
///////////////////////////////////////////////////////////////
package zimport ( "image" "image/draw" "image/jpeg" "image/png" "os")// 讀取JPEG圖片返回image.Image對象func ImageJPEG(ph string) image.Image { // 開啟圖片檔案 f, fileErr := os.Open(ph) if fileErr != nil { return nil } // 退出時關閉檔案 defer f.Close() // 解碼 j, jErr := jpeg.Decode(f) if jErr != nil { return nil } // 返回解碼後的圖片 return j}// 讀取PNG圖片返回image.Image對象func ImagePNG(ph string) image.Image { // 開啟圖片檔案 f, fileErr := os.Open(ph) if fileErr != nil { return nil } // 退出時關閉檔案 defer f.Close() // 解碼 p, pErr := png.Decode(f) if pErr != nil { return nil } // 返回解碼後的圖片 return p}// 按照解析度建立一張空白圖片對象func ImageRGBA(width, height int) *image.RGBA { // 建立映像,image.Rect(最小X,最小Y,最大X,最小Y) return image.NewRGBA(image.Rect(0, 0, width, height))}// 將圖片繪製到圖片func ImageDrawRGBA(img *image.RGBA, imgcode image.Image, x, y int) { // 繪製映像 // image.Point A點的X,Y座標,軸向右和向下增加{0,0} // image.ZP ZP is the zero Point // image.Pt Pt is shorthand for Point{X, Y} draw.Draw(img, img.Bounds(), imgcode, image.Pt(x, y), draw.Over)}// JPEG將編碼產生圖片// 選擇編碼參數,品質範圍從1到100,更高的是更好 &jpeg.Options{90}func ImageEncodeJPEG(ph string, img image.Image) error { // 確保檔案父目錄存在 FcheckParents(ph) // 開啟檔案等待寫入 f := FileW(ph) // 保證檔案正常關閉 defer f.Close() // 寫入檔案 return jpeg.Encode(f, img, &jpeg.Options{100})}// PNG將編碼產生圖片func ImageEncodePNG(ph string, img image.Image) error { // 確保檔案父目錄存在 FcheckParents(ph) // 開啟檔案等待寫入 f := FileW(ph) // 保證檔案正常關閉 defer f.Close() // 寫入檔案 return png.Encode(f, img)}