文章目录

  • 基本操作
    • 读取
    • 新建
    • 保存
  • 图片修改
    • 转换
    • 裁剪
    • 缩放

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简介相关推荐

  1. ImGo Golang 图片处理库

    前言 我是一个 PHPer & Gopher.PHP 有个很好用的图片处理库 Intervention Image,它提供非常简洁的链式调用来操作图片,同时也非常有表现力,看到代码就知道代码要 ...

  2. android知乎多图片选择,知乎开源图片选择库 Matisse

    原标题:知乎开源图片选择库 Matisse 我的引言 Matisse,知乎开源,简洁,易用,不错的图片选择库. 效果预览 项目简介 1.直接在 Activity 和 Fragment 中调用即可: 2 ...

  3. db2top详细使用方法_Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略

    Py之PIL:Python的PIL库的简介.安装.使用方法详细攻略 目录 PIL库的简介 PIL库的安装 PIL库的用方法 1.几何图形的绘制与文字的绘制 2.绘制图形的各种案例 PIL库的简介 PI ...

  4. Py之pycocotools:pycocotools库的简介、安装、使用方法之详细攻略

    Py之pycocotools:pycocotools库的简介.安装.使用方法之详细攻略 目录 pycocotools库的简介 pycocotools库的安装 pycocotools库的使用方法 1.f ...

  5. Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略

    Py之PIL:Python的PIL库的简介.安装.使用方法详细攻略 目录 PIL库的简介 PIL库的安装 PIL库的用方法 1.几何图形的绘制与文字的绘制 2.绘制图形的各种案例 PIL库的简介 PI ...

  6. 图片缩放库 Photoview 和 Gif 控件 GifView 的使用

    课程背景: 在开发中,图片的缩放双击缩放和双击缩小也很重要,可以给用户提供更好的图片浏览体验.有些图片浏览还会涉及到 Gif 动画的播放.通过本课程,你将会学习到图片的缩放处理库和 Gif 播放组件的 ...

  7. Py之pycocotools:pycocotools库的简介、安装、使用方法之详细攻略续篇

    Py之pycocotools:pycocotools库的简介.安装.使用方法之详细攻略 目录 pycocotools库的简介 pycocotools库的安装 pycocotools库的使用方法 1.f ...

  8. Py之lulu:lulu库的简介、安装、案例应用之详细攻略

    Py之lulu:lulu库的简介.安装.案例应用之详细攻略 目录 lulu库的简介 1.支持的站点 lulu库的装 lulu库的案例应用 1.下载音乐 2.下载视频 lulu库的简介 通过该库可下载各 ...

  9. 一个强大、支持100多中格式.Net图片操作库

    我们在项目开发中,对图片的操作可以说是非常常见,比如图片大小改变.图片合并.格式转换.添加水印等,自己开发都需要费不少时间,所以今天给大家介绍一个支持100多格式图片操作库,完全可以满足项目日常的开发 ...

  10. Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略

    Py之cv2:cv2(OpenCV,opencv-python)库的简介.安装.使用方法(常见函数.图像基本运算等)最强详细攻略 目录 cv2(OpenCV,opencv-python)库的简介 1. ...

最新文章

  1. 中国首篇Science机器人子刊!北航软体机器人实验室四年成果登上封面长篇
  2. 同步数据_体验GoldenGate 18C数据同步到ADW
  3. Intent Bundle页面跳转信息的传递
  4. .Net开源微型ORM框架测评
  5. ssl2348-连接格点【图论,最小生成树,并查集】
  6. OpenCL memory object 之 Global memory (2)
  7. 驱动的定义、分类、安全性
  8. 递归过程中语句执行顺序
  9. sqoop从mysql导入hdfs_sqoop 从mysql导入数据到hdfs、hive
  10. 如何高效的学习前端的网页设计?
  11. sencha Touch 2.4 学习之 XTemplate模板
  12. 计算机网络学习笔记(3. 计算机网络结构)
  13. sublime连接Linux进行vim编辑
  14. [USACO13MAR]Poker Hands【贪心】
  15. Java 多线程--- 创建线程、Thread类、synchronized
  16. H3C Comware平台的优势
  17. 866 数据结构模拟题(一)及解析
  18. 大胖子走迷宫 [蓝桥杯 ]
  19. 常见的SAP ERP系统大概要多少钱?
  20. 计算机入门知识(如何使用操作系统)

热门文章

  1. 一元二次方程极简新解法
  2. 更换浏览器标题栏图标
  3. iOS开发系列--NextPrevious On-Demand Resource Basics
  4. foobar2000_备份Foobar2000并将其传输到新计算机
  5. DIY win10 ESD镜像并安装
  6. ajax背景,ajax到底是什么?ajax的背景和使用介绍(附实例解析)
  7. 丹佛机场行李处理系统分析
  8. Apple 850 订单EDI X12报文格式解析
  9. Alien Worlds NFT 自动点击游戏教程 (Allen worlds NFT auto click game tutorial)
  10. xbox360 FSD 安装游戏教程(Freestyle3)