golang圖片處理庫image基本操作_第1頁
golang圖片處理庫image基本操作_第2頁
golang圖片處理庫image基本操作_第3頁
golang圖片處理庫image基本操作_第4頁
golang圖片處理庫image基本操作_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第golang圖片處理庫image基本操作目錄基本操作讀取新建保存圖片修改轉(zhuǎn)換裁剪縮放

基本操作

圖片的基本讀取與保存。

讀取

圖片讀取和文件讀取類似,需要先獲取流:

注冊圖片的解碼器(如:jpg則import_image/jpeg,png則import_image/png)通過os.open打開文件獲取流;通過image.Decode解碼流,獲取圖片;

import_"image/jpeg"

funcreadPic()image.Image{

f,err:=os.Open("C:\\hatAndSunglass.jpg")

iferr!=nil{

panic(err)

deferf.Close()

img,fmtName,err:=image.Decode(f)

iferr!=nil{

panic(err)

fmt.Printf("Name:%v,Bounds:%+v,Color:%+v",fmtName,img.Bounds(),img.ColorModel())

returnimg

}

解碼后返回的第一個參數(shù)為Image接口:

typeImageinterface{

ColorModel()color.Model//返回圖片的顏色模型

Bounds()Rectangle//返回圖片外框

At(x,yint)color.Color//返回(x,y)像素點的顏色

新建

新建一個圖片非常簡單,只需image.NewRGBA即可創(chuàng)建一個透明背景的圖片了

img:=image.NewRGBA(image.Rect(0,0,300,300))

保存

保存圖片也很簡單,需要編碼后,寫入文件流即可:

注冊圖片的解碼器通過os.create創(chuàng)建文件;通過png.Encode編碼圖片并寫入文件;

funcsavePic(img*image.RGBA){

f,err:=os.Create("C:\\tmp.jpg")

iferr!=nil{

panic(err)

deferf.Close()

b:=bufio.NewWriter(f)

err=jpeg.Encode(b,img,nil)

iferr!=nil{

panic(err)

b.Flush()

圖片修改

很多操作都需要用到繪制圖片:

funcDraw(dstImage,rimage.Rectangle,srcimage.Image,spimage.Point,opOp)

funcDrawMask(dstImage,rimage.Rectangle,srcimage.Image,spimage.Point,maskimage.Image,mpimage.Point,opOp)?

主要參數(shù)說明:

dst:繪圖的背景圖r:背景圖的繪圖區(qū)域src:要繪制的圖sp:要繪制圖src的開始點op:組合方式

DrawMask多了一個遮罩蒙層參數(shù),Draw為其一種特殊形式(遮罩相關參數(shù)為nil)。

轉(zhuǎn)換

讀取的jpg圖像不是RGBA格式的(為YCbCr格式);在操作前需要先轉(zhuǎn)換格式:

創(chuàng)建一個大小相同的RGBA圖像;把jpg畫到新建的圖像上去;

funcjpg2RGBA(imgimage.Image)*image.RGBA{

tmp:=image.NewRGBA(img.Bounds())

draw.Draw(tmp,img.Bounds(),img,img.Bounds().Min,draw.Src)

returntmp

裁剪

通過subImage方法可方便地裁剪圖片(需要為RGBA格式的)

funcsubImg(){

pic:=readPic()

fmt.Printf("Type:%T\n",pic)

img:=jpg2RCBA(pic)

sub:=img.SubImage(image.Rect(0,0,pic.Bounds().Dx(),pic.Bounds().Dy()/2))

savePic(sub.(*image.RGBA))

縮放

圖片縮放分為保持比例與不保持比例的縮放;保持比例時,要確定新圖片的位置(是否居中),以及如何填充空白處。

為了縮放,需要引入新的庫/x/image/draw。

在保持比例縮放時,需要先計算縮放后的圖片大小:

分別計算寬、高的縮放比例,以小者為準;若是居中(否則靠左上)需要計算填充大小,然后據(jù)此計算位置;

funccalcResizedRect(widthint,srcimage.Rectangle,heightint,centerAlignbool)image.Rectangle{

vardstimage.Rectangle

ifwidth*src.Dy()height*src.Dx(){//width/src.widthheight/src.height

ratio:=float64(width)/float64(src.Dx())

tH:=int(float64(src.Dy())*ratio)

pad:=0

ifcenterAlign{

pad=(height-tH)/2

dst=image.Rect(0,pad,width,pad+tH)

}else{

ratio:=float64(height)/float64(src.Dy())

tW:=int(float64(src.Dx())*ratio)

pad:=0

ifcenterAlign{

pad=(width-tW)/2

dst=image.Rect(pad,0,pad+tW,height)

returndst

有了縮放后的大小后,即可通過雙線性插值bilinear的方式進行圖片的縮放

img為要縮放的圖片width、height為縮放后的大小keepRatio為是否保持比例縮放fill為填充的顏色(R、G、B都為fill)centerAlign:保持比例縮放時,圖片是否居中存放

import(

"image"

"image/color"

"/x/image/draw"

funcresizePic(imgimage.Image,widthint,heightint,keepRatiobool,fillint,centerAlignbool)image.Image{

outImg:=image.NewRGBA(image.Rect(0,0,width,height))

if!keepRatio{

draw.BiLinear.Scale(outImg,outImg.Bounds(),img,img.Bounds(),draw.Over,nil)

returnoutImg

iffill!=0{

fillColor:=color.RGBA{R:uint8(fill),G:uint8(fill),B:uint8(fill),A:255}

draw.Draw(outImg,outImg.Bounds(),image.Uniform{C:fillColor},image.Point{},dr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論