golang图片处理库image基本操作

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

基本操作

图片的基本读取与保存。

读取

图片读取和文件读取类似,需要先获取流:

  • 注册图片的解码器(如: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.Rectangle
    if width*src.Dy() < height*src.Dx() { // width/src.width < height/src.height
        ratio := float64(width) / float64(src.Dx())

        tH := int(float64(src.Dy()) * ratio)
        pad := 0
        if 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 := 0
        if 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简介的文章就介绍到这了,更多相关golang图片处理库image内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang image图片处理示例

    本文实例讲述了golang image图片处理方法.分享给大家供大家参考,具体如下: golang处理图片挺简单的,我是过功能挺简单的,没有过一个缩略图方法. 复制代码 代码如下: package main import (     "fmt"     "os"     "image"     "image/color"     "image/draw"     "image/jpeg"

  • golang图片处理库image基本操作

    目录 基本操作 读取 新建 保存 图片修改 转换 裁剪 缩放 基本操作 图片的基本读取与保存. 读取 图片读取和文件读取类似,需要先获取流: 注册图片的解码器(如:jpg则import _ "image/jpeg", png则import _ "image/png") 通过os.open打开文件获取流: 通过image.Decode解码流,获取图片: import _ "image/jpeg" func readPic() image.Image

  • golang连接redis库及基本操作示例过程

    目录 Redis介绍 Redis支持的数据结构 Redis应用场景 准备Redis环境 go-redis库 安装 连接 V8新版本相关 连接Redis哨兵模式 连接Redis集群 基本使用 HVals set/get示例 zset示例 根据前缀获取Key 执行自定义命令 按通配符删除key Pipeline 事务 Watch Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上.除此之外,通过复制.持久化

  • python图片处理库Pillow实现简单PS功能

    目录 安装 基本操作 打开图像 转换格式 展示图片 剪裁 合并 缩略图 旋转 滤镜 二次创作 画线 文字 总结 文 | 豆豆 来源:Python 技术「ID: pythonall」 在我们的日常生活和工作中有不少场景需要简单处下理图片,很多人都是依赖 PS.美图秀秀等各种图像处理工具,殊不知在你打开软件的一瞬间 Python 就已经将图片处理完了.听起来是不是很神奇,正所谓是 Python 在手,啥也不愁. 安装 老规矩,先通过 pip 安装到本地机器. pip install Pillow 基

  • 深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)

    日志处理经常有以下几个需求: 1.不同级别的日志输出到不同的日志文件中. 2.日志文件按照文件大小或日期进行切割存储,以避免单一日志文件过大. 3.日志使用简单方便,一次定义全局使用. 建议使用使用Uber-go的Zap Logger,大神李文周大博客已经说的非常明确了,请先参考李老师的博客: https://www.liwenzhou.com/posts/Go/zap/ 问题二和问题三需要补充描述: 一.日志按照级别分文件切割存储 1.1 首先实现两个判断日志等级的interface info

  • Python 图片处理库exifread详解

    [导语]:用 python 怎样获得图片的GPS信息?今天推荐一下 exifread 这个神奇的库,不仅仅是 GPS 信息,几乎能能获得图片的所有信息,快进来看看!! 要怎样获得拍摄图片的GPS呢?这里我们需要exifread 库,这个就是用来提取 GPS 信息的.直接 pip install exifread 来安装就好了. 其实不仅能获得GPS信息,图片的几乎所有信息都能获得.exifread的作用其实是代替了查看图片属性!如下图: 这里用在三亚拍的骆驼照片来做个演示,看看能不能定位到三亚.

  • golang连接sqlx库的操作使用指南

    目录 安装sqlx 基本使用 连接数据库 查询 插入.更新和删除 NamedExec NamedQuery 事务操作 sqlx.In的批量插入示例 表结构 结构体 bindvars(绑定变量) 自己拼接语句实现批量插入 使用sqlx.In实现批量插入 使用NamedExec实现批量插入 sqlx.In的查询示例 in查询 in查询和FIND_IN_SET函数 sqlx库使用指南 在项目中我们通常可能会使用database/sql连接MySQL数据库.本文借助使用sqlx实现批量插入数据的例子,介

  • Golang使用ini库读取配置详情

    目录 go-ini的分区 go-ini的安装 ini文件的格式 读取ini文件的配置项 直接加在ini文件,通过方法读取 定义结构体来存放配置项,将配置项映射到结构体中 父子分区 两份关键代码 go-ini的分区 go-ini的多个配置项通过分区(section)来划分.有默认(空)分区和命名的分区,没有给分区命名就是默认分区,默认分区必须写在任何一个命名分区的上边.每个配置项通过换行来区分. go-ini的安装 go-ini/ini是GitHub上的一个代码库,和其他golang库一样,通过g

  • GoLang之标准库encoding/json包

    目录 1.JSON介绍 2.JSON序列化.反序列化介绍 3.encoding/json包介绍 4.Marshal函数 5.Umarshal函数 6.结构体标签Tag 注:本文以Windos系统上Go SDK v1.8进行讲解 1.JSON介绍 在进行前后分离式开发时,json显得格外的重要,因为他是链接前后台重要的枢纽json是储存和交换文本信息的语法,他类似于xml,但是他比xml更加的便捷,快速,易于解析.主要使用场景就是作为前后台数据交互的枢纽,以下是一个简单json的格式:JSON:

  • Golang官方限流器库实现限流示例详解

    目录 前言 例子 实现 小结 前言 在翻Golang官方库的过程中,发现一个有趣的库golang.org/x/time ,里面只有一个类rate,研究了一下发现它是一个限流器,实现了很多的功能,当然它的核心原理并不复杂,也就是令牌桶算法. 令牌桶算法的原理是:令牌桶会不断地把令牌添加到桶里,而请求会从桶中获取令牌,只有拥有令牌地请求才能被接受.因为桶中可以提前保留一些令牌,所以它允许一定地突发流量通过. 例子 下面是限流算法常见的写法,首先判断是否有令牌,如果有就通过,否则直接失败. packa

  • Golang 经典校验库 validator 用法解析

    目录 开篇 validator 使用方法 内置校验器 1. Fields 2. Network 3. Strings 4. Formats 5. Comparisons 6. Other 7. 别名 错误处理 小结 开篇 今天继续我们的 Golang 经典开源库学习之旅,这篇文章的主角是 validator,Golang 中经典的校验库,它可以让开发者可以很便捷地通过 tag 来控制对结构体字段的校验,使用面非常广泛. 本来打算一节收尾,越写越发现 validator 整体复杂度还是很高的,而且

随机推荐