golang图片处理库image简介
文章目录
- 基本操作
- 读取
- 新建
- 保存
- 图片修改
- 转换
- 裁剪
- 缩放
go中处理图片的标准库image支持常见的PNG、JPEG、GIF等格式的图片处理(可读取、裁剪、绘制、生成等)。
基本操作
图片的基本读取与保存。
读取
图片读取和文件读取类似,需要先获取流:
- 注册图片的解码器(如:jpg则
import _ "image/jpeg"
, png则import _ "image/png"
) - 通过
os.open
打开文件获取流; - 通过
image.Decode
解码流,获取图片;
import _ "image/jpeg"func readPic() image.Image {f, err := os.Open("C:\\hatAndSunglass.jpg")if err != nil {panic(err)}defer f.Close()img, fmtName, err := image.Decode(f)if err != nil {panic(err)}fmt.Printf("Name: %v, Bounds: %+v, Color: %+v", fmtName, img.Bounds(), img.ColorModel())return img
}
解码后返回的第一个参数为Image接口:
type Image interface {ColorModel() color.Model // 返回图片的颜色模型Bounds() Rectangle // 返回图片外框At(x, y int) color.Color // 返回(x,y)像素点的颜色
}
新建
新建一个图片非常简单,只需image.NewRGBA
即可创建一个透明背景的图片了
img := image.NewRGBA(image.Rect(0, 0, 300, 300))
保存
保存图片也很简单,需要编码后,写入文件流即可:
- 注册图片的解码器
- 通过
os.create
创建文件; - 通过
png.Encode
编码图片并写入文件;
func savePic(img *image.RGBA) {f, err := os.Create("C:\\tmp.jpg")if err != nil {panic(err)}defer f.Close()b := bufio.NewWriter(f)err = jpeg.Encode(b, img, nil)if err != nil {panic(err)}b.Flush()
}
图片修改
很多操作都需要用到绘制图片:
func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op)
func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op)
主要参数说明:
- dst:绘图的背景图
- r:背景图的绘图区域
- src:要绘制的图
- sp:要绘制图src的开始点
- op:组合方式
DrawMask多了一个遮罩蒙层参数,Draw为其一种特殊形式(遮罩相关参数为nil)。
转换
读取的jpg图像不是RGBA格式的(为YCbCr格式);在操作前需要先转换格式:
- 创建一个大小相同的RGBA图像;
- 把jpg画到新建的图像上去;
func jpg2RGBA(img image.Image) *image.RGBA {tmp := image.NewRGBA(img.Bounds())draw.Draw(tmp, img.Bounds(), img, img.Bounds().Min, draw.Src)return tmp
}
裁剪
通过subImage方法可方便地裁剪图片(需要为RGBA格式的)
func subImg() {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))
}
缩放
图片缩放分为保持比例与不保持比例的缩放;保持比例时,要确定新图片的位置(是否居中),以及如何填充空白处。
为了缩放,需要引入新的库golang.org/x/image/draw
。
在保持比例缩放时,需要先计算缩放后的图片大小:
- 分别计算宽、高的缩放比例,以小者为准;
- 若是居中(否则靠左上)需要计算填充大小,然后据此计算位置;
func calcResizedRect(width int, src image.Rectangle, height int, centerAlign bool) image.Rectangle {var dst image.Rectangleif width*src.Dy() < height*src.Dx() { // width/src.width < height/src.heightratio := float64(width) / float64(src.Dx())tH := int(float64(src.Dy()) * ratio)pad := 0if centerAlign {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 := 0if centerAlign {pad = (width - tW) / 2}dst = image.Rect(pad, 0, pad+tW, height)}return dst
}
有了缩放后的大小后,即可通过双线性插值bilinear的方式进行图片的缩放
- img为要缩放的图片
- width、height为缩放后的大小
- keepRatio为是否保持比例缩放
- fill为填充的颜色(R、G、B都为fill)
- centerAlign:保持比例缩放时,图片是否居中存放
import ("image""image/color""golang.org/x/image/draw"
)func resizePic(img image.Image, width int, height int, keepRatio bool, fill int, centerAlign bool) 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)return outImg}if fill != 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{}, draw.Src)}dst := calcResizedRect(width, img.Bounds(), height, centerAlign)draw.ApproxBiLinear.Scale(outImg, dst.Bounds(), img, img.Bounds(), draw.Over, nil)return outImg
}
golang图片处理库image简介相关推荐
- ImGo Golang 图片处理库
前言 我是一个 PHPer & Gopher.PHP 有个很好用的图片处理库 Intervention Image,它提供非常简洁的链式调用来操作图片,同时也非常有表现力,看到代码就知道代码要 ...
- android知乎多图片选择,知乎开源图片选择库 Matisse
原标题:知乎开源图片选择库 Matisse 我的引言 Matisse,知乎开源,简洁,易用,不错的图片选择库. 效果预览 项目简介 1.直接在 Activity 和 Fragment 中调用即可: 2 ...
- db2top详细使用方法_Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略
Py之PIL:Python的PIL库的简介.安装.使用方法详细攻略 目录 PIL库的简介 PIL库的安装 PIL库的用方法 1.几何图形的绘制与文字的绘制 2.绘制图形的各种案例 PIL库的简介 PI ...
- Py之pycocotools:pycocotools库的简介、安装、使用方法之详细攻略
Py之pycocotools:pycocotools库的简介.安装.使用方法之详细攻略 目录 pycocotools库的简介 pycocotools库的安装 pycocotools库的使用方法 1.f ...
- Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略
Py之PIL:Python的PIL库的简介.安装.使用方法详细攻略 目录 PIL库的简介 PIL库的安装 PIL库的用方法 1.几何图形的绘制与文字的绘制 2.绘制图形的各种案例 PIL库的简介 PI ...
- 图片缩放库 Photoview 和 Gif 控件 GifView 的使用
课程背景: 在开发中,图片的缩放双击缩放和双击缩小也很重要,可以给用户提供更好的图片浏览体验.有些图片浏览还会涉及到 Gif 动画的播放.通过本课程,你将会学习到图片的缩放处理库和 Gif 播放组件的 ...
- Py之pycocotools:pycocotools库的简介、安装、使用方法之详细攻略续篇
Py之pycocotools:pycocotools库的简介.安装.使用方法之详细攻略 目录 pycocotools库的简介 pycocotools库的安装 pycocotools库的使用方法 1.f ...
- Py之lulu:lulu库的简介、安装、案例应用之详细攻略
Py之lulu:lulu库的简介.安装.案例应用之详细攻略 目录 lulu库的简介 1.支持的站点 lulu库的装 lulu库的案例应用 1.下载音乐 2.下载视频 lulu库的简介 通过该库可下载各 ...
- 一个强大、支持100多中格式.Net图片操作库
我们在项目开发中,对图片的操作可以说是非常常见,比如图片大小改变.图片合并.格式转换.添加水印等,自己开发都需要费不少时间,所以今天给大家介绍一个支持100多格式图片操作库,完全可以满足项目日常的开发 ...
- Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略
Py之cv2:cv2(OpenCV,opencv-python)库的简介.安装.使用方法(常见函数.图像基本运算等)最强详细攻略 目录 cv2(OpenCV,opencv-python)库的简介 1. ...
最新文章
- 中国首篇Science机器人子刊!北航软体机器人实验室四年成果登上封面长篇
- 同步数据_体验GoldenGate 18C数据同步到ADW
- Intent Bundle页面跳转信息的传递
- .Net开源微型ORM框架测评
- ssl2348-连接格点【图论,最小生成树,并查集】
- OpenCL memory object 之 Global memory (2)
- 驱动的定义、分类、安全性
- 递归过程中语句执行顺序
- sqoop从mysql导入hdfs_sqoop 从mysql导入数据到hdfs、hive
- 如何高效的学习前端的网页设计?
- sencha Touch 2.4 学习之 XTemplate模板
- 计算机网络学习笔记(3. 计算机网络结构)
- sublime连接Linux进行vim编辑
- [USACO13MAR]Poker Hands【贪心】
- Java 多线程--- 创建线程、Thread类、synchronized
- H3C Comware平台的优势
- 866 数据结构模拟题(一)及解析
- 大胖子走迷宫 [蓝桥杯 ]
- 常见的SAP ERP系统大概要多少钱?
- 计算机入门知识(如何使用操作系统)
热门文章
- 一元二次方程极简新解法
- 更换浏览器标题栏图标
- iOS开发系列--NextPrevious On-Demand Resource Basics
- foobar2000_备份Foobar2000并将其传输到新计算机
- DIY win10 ESD镜像并安装
- ajax背景,ajax到底是什么?ajax的背景和使用介绍(附实例解析)
- 丹佛机场行李处理系统分析
- Apple 850 订单EDI X12报文格式解析
- Alien Worlds NFT 自动点击游戏教程 (Allen worlds NFT auto click game tutorial)
- xbox360 FSD 安装游戏教程(Freestyle3)