Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Imageprocess is a simple Go image processing package. Supports WEBP, JPG, JPEG, PNG, BMP, TIFF, GIF.Imageprocess是一个简单的Go图像处理包。支持 WEBP,JPG,JPEG,PNG,BMP,TIFF,GIF。

License

NotificationsYou must be signed in to change notification settings

AndsGo/imageprocess

Repository files navigation

imgaeprocess

本项目基于以下开源库:imaging

About Imaging is a simple image processing package for Go

webp

WebP decoder and encoder for Go (Zero Dependencies).

gg

Go Graphics - 2D rendering in Go with a simple API.

Imageprocess是一个简单的Go图像处理包。支持 WEBP,JPG,JPEG,PNG,BMP,TIFF,GIF。提供了类似阿里云oss的图片处理能力。包括:

图片缩放

图片水印

自定义裁剪

质量变换

格式转换

模糊效果

旋转

亮度

锐化

对比度

参数兼容阿里云oss图片处理参数,可以用于搭建本地文件oss图片处理系统。

0.安装

go get github.com/AndsGo/imageprocess

1.代码示例

代码Api使用示例

// 改变大小,高100px,宽300px,模式等比缩放匹配最大边img=imageprocess.ResizeImage(img,ResizeOption{ResizeMode:Lfit,Width:10,Height:100)// 将原图缩放成宽高100 px:`resize,h_100,w_100` 缩放模式fill:`m_fill`img=imageprocess.ResizeImage(img,ResizeOption{ResizeMode:Fill,Width:10,Height:100)// 将原图缩放成宽高100 px:`resize,h_100,w_100` 缩放模式pad:`m_pad`。 以红色填充:`color_FF0000`img=imageprocess.ResizeImage(img,ResizeOption{ResizeMode:Pad,Width:10,Height:100Color:&color.RGBA{R:255,G:0,B:0,A:255}})// 将example.jpg缩略为宽高300:`resize,w_300,h_300` 水印内容为“Hello World”:`text_Hello%20World 水印文字颜色为白色、字体大小为30:`color_FFFFFF,size_30` ` 水印文字位置是右下、水平边距10、中线垂直偏移10:`g_se,x_10,y_10`// 多模式串行处理可以使用Process或(ProcessGif)方法,你也可以全部使用Process或(ProcessGif)方法进行处理options:=make([]Option,0)options=append(options,Option{Resize,ResizeOption{Width:300,Height:300)options=append(options,Option{Watermark,TextWatermarkOption{WatermarkOption:WatermarkOption{Opacity:20,Position:Center,X:10,Y:10,},Color:&color.RGBA{255,255,255,1},Size:30,Text:"Hello World"}})imageprocess.Process(img,file,options)// 裁剪起点为(800,500):`crop,x_800,y_500` 裁减范围300 px*300 px:`w_300,h_300`img=imageprocess.CropImage(img,CropOption{X:800,Y:500,Width:300,Height:300})// 裁剪起点为原图右下角:`crop,g_se` 裁减范围900 px*900 px:`w_900,h_900`img=imageprocess.CropImage(img,CropOption{Position:SouthEast,Width:900,Height:900})// 原图缩放为宽100 px:`resize,w_100,h_100` 图片相对质量设置为80%:`quality,q_80`options:=make([]Option,0)options=append(options,Option{Resize,ResizeOption{Width:100,Height:100)// 质量options=append(options,Option{Quality,QualityOption{Quality:80}})// 格式转换为PNGoptions=append(options,Option{FormatType,FormatOption{Format:PNG}})imageprocess.Process(img,file,options)// 将原图按顺时针旋转90°img=imageprocess.AddjustRotate(img,RotateOption{Value:90})// 将图片亮度提高50img=imageprocess.AddjustBright(img,BrightnessOption{Value:50})// 对原图进行锐化处理,锐化参数为100img=imageprocess.AddjustSharpen(img,SharpenOption{Value:100})// 对比度提高50img=imageprocess.AddjustContrast(img,ContrastOption{Value:50})

综合代码示例请查看

process_test.go

package imageprocessimport ("image/color""os""testing")funcTest_Process(t*testing.T) {img,f,err:=LoadImage("examples/example.jpg")iferr!=nil {t.Error(err)}file,_:=os.Create("examples/out.jpg")options:=make([]Option,0)// 格式转换为PNGoptions=append(options,Option{FormatType,FormatOption{Format:PNG}})//  改变大小options=append(options,Option{Resize,ResizeOption{ResizeMode:Pad,Width:300,Height:300,Color:&color.RGBA{R:255,G:255,B:0,A:255}}})// 裁剪options=append(options,Option{Crop,CropOption{Width:200,Height:200,X:0,Y:0,Position:Center}})// 水印options=append(options,Option{Watermark,TextWatermarkOption{WatermarkOption:WatermarkOption{Opacity:100,Position:South,X:10,Y:10,},Color:&color.RGBA{111,222,111,1},Size:40,Text:"hello watermark"}})// 模糊options=append(options,Option{Blur,GammaOption{Value:5}})// 质量options=append(options,Option{Quality,QualityOption{Quality:500}})err=Process(img,file,f,options)iferr!=nil {t.Error(err)}}funcTest_ProcessGif(t*testing.T) {img,err:=LoadGif("examples/example.gif")iferr!=nil {t.Error(err)}file,_:=os.Create("examples/out.gif")options:=make([]Option,0)// 格式转换为GIFoptions=append(options,Option{FormatType,FormatOption{Format:GIF}})options=append(options,Option{Gamma,GammaOption{Value:500}})options=append(options,Option{Resize,ResizeOption{ResizeMode:Pad,Width:300,Height:300,Color:&color.RGBA{R:255,G:255,B:255,A:1}}})options=append(options,Option{Crop,CropOption{Width:200,Height:200,X:0,Y:0,Position:Center}})options=append(options,Option{Watermark,TextWatermarkOption{WatermarkOption:WatermarkOption{Opacity:20,Position:Center,X:10,Y:10,},Color:&color.RGBA{0,0,0,1},Size:40,Text:"hello watermark"}})err=ProcessGif(img,file,options)iferr!=nil {t.Error(err)}}funcTest_UrlOptions(t*testing.T) {img,f,err:=LoadImage("examples/example.jpg")iferr!=nil {t.Error(err)}file,_:=os.Create("examples/out.jpg")// 增加水印,然后修改大小options,err:=ParseOptions("image/watermark,t_30,g_center,x_10,y_10,text_hello watermark,color_1366ec,size_200/resize,m_pad,h_100,w_100,color_FF0000")iferr!=nil {t.Error(err)}err=Process(img,file,f,options)iferr!=nil {t.Error(err)}}
MeaningImage
改变大小,高100px,宽300px,模式等比缩放匹配最大边break
将原图缩放成宽高100 px:resize,h_100,w_100 缩放模式fill:m_fill自动裁剪
将原图缩放成宽高100 px:resize,h_100,w_100 缩放模式pad:m_pad。 以红色填充:color_FF0000填充红色
将example.jpg缩略为宽高300:resize,w_300,h_300 水印内容为“Hello World”:text_Hello%20World 水印文字颜色为白色、字体大小为30:color_FFFFFF,size_30 水印文字位置是右下、水平边距10、中线垂直偏移10:g_se,x_10,y_10图片处理1
裁剪起点为(800,500):crop,x_800,y_500 裁减范围300 px*300 px:w_300,h_300裁剪2
裁剪起点为原图右下角:crop,g_se 裁减范围900 px*900 px:w_900,h_900裁剪3
原图缩放为宽100 px:resize,w_100,h_100 图片相对质量设置为80%:quality,q_80变换1
将原图转换为PNG格式png
将原图按顺时针旋转90°旋转1
将图片亮度提高50亮度1
对原图进行锐化处理,锐化参数为100锐化1
对比度提高50对比度2

2.参数示例

url参数示例

格式转换可以在process_test中进行测试 ,测试代码如下

funcTest_UrlOptions(t*testing.T) {img,f,err:=LoadImage("examples/example.jpg")iferr!=nil {t.Error(err)}file,_:=os.Create("examples/out.jpg")// 增加水印,然后修改大小options,err:=ParseOptions("image/watermark,t_30,g_center,x_10,y_10,text_hello watermark,color_1366ec,size_200/resize,m_pad,h_100,w_100,color_FF0000")iferr!=nil {t.Error(err)}// 处理图片err=Process(img,file,f,options)iferr!=nil {t.Error(err)}}
OptionsMeaningImage
resize,h_100,w_300,m_lfit改变大小,高100px,宽300px,模式等比缩放匹配最大边break
resize,m_fill,h_100,w_100将原图缩放成宽高100 px:resize,h_100,w_100 缩放模式fill:m_fill自动裁剪
resize,m_pad,h_100,w_100,color_FF0000将原图缩放成宽高100 px:resize,h_100,w_100 缩放模式pad:m_pad。 以红色填充:color_FF0000填充红色
resize,w_300,h_300/watermark,size_30,text_Hello World,color_FFFFFF,g_se,x_10,y_10将example.jpg缩略为宽高300:resize,w_300,h_300 水印内容为“Hello World”:text_Hello%20World 水印文字颜色为白色、字体大小为30:color_FFFFFF,size_30 水印文字位置是右下、水平边距10、中线垂直偏移10:g_se,x_10,y_10图片处理1
crop,x_800,y_500,w_300,h_300裁剪起点为(800,500):crop,x_800,y_500 裁减范围300 px*300 px:w_300,h_300裁剪2
crop,w_900,h_900,g_se裁剪起点为原图右下角:crop,g_se 裁减范围900 px*900 px:w_900,h_900裁剪3
resize,w_100/quality,q_80原图缩放为宽100 px:resize,w_100 图片相对质量设置为80%:quality,q_80变换1
format,png将原图转换为PNG格式png
rotate,90将原图按顺时针旋转90°旋转1
bright,50将图片亮度提高50亮度1
sharpen,100对原图进行锐化处理,锐化参数为100锐化1
contrast,-50对比度提高50对比度2

3.综合示例

这是一个简单文件服务器的例子,代码位于examples文件夹下

cd examplesgo run example.go

原图: 2500*1875image

访问:

http://127.0.0.1:8080/file/example.jpg?x-oss-process=image/resize,w_500,h_300/watermark,t_80,g_se,x_10,y_10,text_hello,color_FFFFFF,size_40/format,webp

结果: 400*300 65.4k

imgae

转换代码表示:

resize,w_500,h_300 转换宽500,高300

watermark,t_80,g_se,x_10,y_10,text_hello,color_FFFFFF,size_40 增加水印,水印位置位于右下,离边缘距离为10,水印内容为hello,颜色为FFFFFF,文字大小为40

format,webp格式转换为webp

示例代码(你测试自己的图片需要修改fileFolders):

package mainimport ("fmt""image/gif""io""net/http""os""strings""github.com/AndsGo/imageprocess")// 文件夹,you need change itvarfileFolders="./"funcmain() {http.HandleFunc("/file/",fileHandler)fmt.Println("Starting server on :8080")iferr:=http.ListenAndServe(":8080",nil);err!=nil {fmt.Println("Server failed:",err)}}funcfileHandler(w http.ResponseWriter,r*http.Request) {// 获取文件名称fileName:=strings.TrimPrefix(r.URL.Path,"/file/")// 打开文件file,err:=os.Open(fmt.Sprintf("%s%s",fileFolders,fileName))iferr!=nil {http.Error(w,"File not found",http.StatusNotFound)return}deferfile.Close()// 获取参数// 获取文件后缀f,err:=imageprocess.FormatFromExtension(fileName)iferr!=nil {// 将处理后的文件内容写入响应if_,err:=io.Copy(w,file);err!=nil {http.Error(w,"Failed to send file",http.StatusInternalServerError)}return}//处理处理参数ossParams:=r.URL.Query().Get("x-oss-process")ifossParams=="" {//无需处理if_,err:=io.Copy(w,file);err!=nil {http.Error(w,"Failed to send file",http.StatusInternalServerError)}return}options,err:=imageprocess.ParseOptions(ossParams)iferr!=nil {http.Error(w,fmt.Sprintf("ParseOptions %s",err.Error()),http.StatusInternalServerError)return}iflen(options)==0 {//无需处理if_,err:=io.Copy(w,file);err!=nil {http.Error(w,"Failed to send file",http.StatusInternalServerError)}return}//处理图片err=processImg(file,w,f,options)iferr!=nil {http.Error(w,fmt.Sprintf("processFile %s",err.Error()),http.StatusInternalServerError)}}// 进行转换funcprocessImg(file io.Reader,w io.Writer,f imageprocess.Format,options []imageprocess.Option)error {iff==imageprocess.GIF {imgGif,err:=gif.DecodeAll(file)iferr!=nil {returnerr}returnimageprocess.ProcessGif(imgGif,w,options)}else {img,err:=imageprocess.DecodeImage(file,f)iferr!=nil {returnerr}returnimageprocess.Process(img,w,f,options)}}

About

Imageprocess is a simple Go image processing package. Supports WEBP, JPG, JPEG, PNG, BMP, TIFF, GIF.Imageprocess是一个简单的Go图像处理包。支持 WEBP,JPG,JPEG,PNG,BMP,TIFF,GIF。

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages


[8]ページ先頭

©2009-2025 Movatter.jp