Go 图像处理

Golang中的image包提供了基本的图像类型、颜色模型、以及用于处理图像的各种函数和接口。

常用类型与接口

image.Image 接口

这是Go语言中处理图像的核心接口,定义了所有图像必须实现的方法:

type Image interface {// Bounds returns the domain for which At can return non-zero color.// The bounds do not necessarily contain the point (0, 0).Bounds() Rectangle// At returns the color of the pixel at (x, y).// At must panic if x or y are outside the bounds of the image.At(x, y int) color.Color
}

color.Color 接口

表示一种颜色,需要实现以下方法: 

type Color interface {// RGBA returns the alpha-premultiplied red, green, blue and alpha values// for the color. Each value ranges within [0, 0xffff], but is represented// by a uint32 so that multiplying by a blend factor up to 0xffff will not// overflow.RGBA() (r, g, b, a uint32)
}

color.RGBA 结构体

实现了color.Color接口,代表一个由红绿蓝透明度组成的颜色: 

type RGBA struct {R, G, B, A uint8
}

image.Decode

从输入流(如文件或网络连接)解码图像,并返回一个实现了image.Image接口的对象:

func Decode(r io.Reader) (img image.Image, err error)
file, err := os.Open("example.png")
if err != nil {panic(err)
}
defer file.Close()img, _, err := image.Decode(file)
if err != nil {panic(err)
}
// 使用解码后的img进行后续操作

image.DecodeConfig

仅解码图像的配置信息而不加载完整图像数据: 

func DecodeConfig(r io.Reader) (cfg image.Config, err error)
file, err := os.Open("example.gif")
if err != nil {panic(err)
}
defer file.Close()config, err := image.DecodeConfig(file)
if err != nil {panic(err)
}
fmt.Printf("Image dimensions: %d x %d, Color model: %v\n", config.Width, config.Height, config.ColorModel)

案例

package mainimport ("image""image/draw""image/jpeg""os"
)func main() {// 读取原图file, err := os.Open("需要时jpeg格式的才行.jpeg")if err != nil {panic(err)}defer file.Close()img, err := jpeg.Decode(file)if err != nil {panic(err)}width := 600height := 400// 创建一个新的图片,大小为指定的宽和高newImg := image.NewRGBA(image.Rect(0, 0, width, height))// 裁剪图片   使用 draw.Draw 简单缩放(质量较低,可能会出现像素化)draw.Draw(newImg, newImg.Bounds(), img, image.Point{}, draw.Src)// 重新编码并保存outputFile, err := os.Create("output.jpg")if err != nil {panic(err)}defer outputFile.Close()// 设置压缩选项outputQuality := 80opts := &jpeg.Options{Quality: outputQuality,}err = jpeg.Encode(outputFile, newImg, opts)if err != nil {panic(err)}
}

 使用 draw.Src 方式将原图直接绘制到目标图像上,这相当于最简单的像素复制,可能会导致图像质量下降,特别是对于缩小操作时,会出现明显的像素化现象。这种方法适用于对图像质量要求不高的场景,或者作为临时解决方案

请注意,这种方法并不推荐用于高质量的图像缩放,因为它没有采用任何插值算法来平滑过渡像素,导致缩放后的图像质量较差。对于实际项目中对图像大小调整的需求,建议使用专门的图像处理库如 github.com/nfnt/resize它提供了多种高质量的插值算法(如 Lanczos 等),能够更好地保持图像细节和视觉效果。

这些只是image包中的一部分功能。根据实际需求,还可以使用其他子包(如image/jpegimage/pngimage/gif等)进行特定格式的编码和解码,或利用image/draw包进行更复杂的图像合成操作。

使用第三方包处理

imaging一个简单、实用的图像处理工具

文档:

  • https://github.com/disintegration/imaging

  • https://pkg.go.dev/github.com/disintegration/imaging

  • Go Image Filtering Toolkit: https://github.com/disintegration/gift

安装

        go get github.com/disintegration/imaging 

package mainimport ("github.com/disintegration/imaging""log"
)func main() {// 打开一个图片文件src, err := imaging.Open("./1716282750475.jpg")if err != nil {log.Fatalf("无法打开图像: %v", err)}// 生成缩略图dst := imaging.Thumbnail(src, 100, 100, imaging.Lanczos)// 保存err = imaging.Save(dst, "thumbnail.jpg")if err != nil {log.Fatalf("无法保存图像: %v", err)} else {log.Println("保存图像成功")}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rocketmq 学习二 基本概念

教程:基本概念 | RocketMQ 视频教程 https://www.bilibili.com/video/BV1d5411y7UW?vd_sourcef1bd3b5218c30adf0a002c8c937e0a27 版本:5.0 一 基本概念 1.1 生产者/Producer 1.1.1 定义 消息发布者。是构建并传输消息到服务端的运行实体。…

异众比率(variation ratio)

异众比率(variation ratio)是指非众数组的频数占总频数的比率,其计算公式为: 其中,为众数组的频数。 异众比率主要用于衡量众数对一组数据的代表程度。异众比率越大,说明非众数组的频数占总频数的比重越大&#xff0…

harbor 认证

Harbor 认证过程 Harbor以 Docker Registry v2认证为基础,添加上一层权限保护。1.v2 集成了一个安全认证的功能,将安全认证暴露给外部服务,让外部服务去实现2.强制用户每次Docker pull/push请求都要带一个合法的Token,Registry会…

python的requests爬虫模块使用代理ip方法---集合

形式一 import requests proxies {http:128.3.74.224:2890,https:128.3.74.224:2890} ip requests.get(http://httpbin.org/ip,proxiesproxies) print(ip.text)形式二 形式一不行的情况下,试试形式二 import requests proxies {http:http://127.0.0.1:7890,http…

【AHK V2】设计模式之命令模式

目录 情景剧场什么是命令模式优缺点优点缺点 使用命令模式的步骤命令模式代码示例合理使用AI工具自动生成代码 情景剧场 我们来设想一个场景: 你进入一家餐馆,餐馆只有老板一个人(老板即厨师)。 “老板,一份小炒肉&am…

Vue插槽solt如何传递具名插槽的数据给子组件?

在Vue中,你可以通过作用域插槽(scoped slots)来传递数据给子组件。这同样适用于具名插槽。首先,你需要在子组件中定义一个具名插槽,并通过v-slot指令传递数据。例如: 子组件(ChildComponent.vu…

自用RedisConfig的配置,更改key为string和value json的序列化,避免set乱的key

自用RedisConfig的配置,更改key为string和value json的序列化,避免set乱的key,使用StringRedisTemplate也可以解决,保证了redis set的值是正确的 Configuration public class RedisConfig {//更改key为string和value json的序列化…

吃透1850道真题和解析备考AMC8和AMC(1020240524持续发布)

多做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一,通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。 今天我们继续…

在新cloud上启动备份数据库

情况介绍:在云上划拉一块地方建立本地数据库测试环境,通过数据库备份包恢复数据并启动。 1.在云上或者你自己的server上安装Percona Server for MySQL,步骤如下 Use APT repositories - Percona Server for MySQL How to Install or Upgra…

java实现List对象转geojson文本返回前端

1.业务需求 查询带有经纬度数据的list列表,将其转为geojson格式给前端。 2.GeoJson格式说明 GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法(JavaScript Object Notation, 简称JSON)的地理空间信息数据交换格式。GeoJSON对…

计算机系统的层次结构

操作系统的定义 操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基…

GBase 8s 如何查看回滚的事务 和对应的SQL

描述: 如何查看当前数据库中是否有事务在回滚, 如果有, 具体是哪条 SQL 在回滚? 解决办法: 方法1: 通过 onstat -u|grep RP; 可以获取相关的 sessionid。 通过 onstat -g ses sid 获取 SQL&a…

【多模态融合】Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

论文链接:Cross Modal Transformer: Towards Fast and Robust 3D Object Detection 代码链接:https://github.com/junjie18/CMT 作者:Junjie Yan, Yingfei Liu, Jianjian Sun, Fan Jia, Shuailin Li, Tiancai Wang, Xiangyu Zhang 发表单位…

字符串的周期:每一期都有那么几位

【题目描述】 如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例 如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。 输入一个长度不超过80的字符串(不含空格),输出其最小周期。 输入第一行表示有T组数据,后续是T行字符串。输出的每组…

性能测试工具

性能测试工具 1.Jmeter 环境搭建1.安装JDK2.安装Jmeter1.下载2.安装3.环境配置 3.Jmeter 文件目录介绍1.bin目录2.docs 目录3.printable_docs目录4.lib目录 4.修改默认配置1.汉化配置2.修改主题 5.元件的基本介绍6.元件的作用域作用域的原则 7.元件的执行顺序 1.Jmeter 环境搭建…

Linux基础-目录命令

目录文件命令 一、概述二、文件目录1. 目录信息1. pwd:显示当前目录2. cd :切换目录3. ls:显示目录中的文件信息 2. 操作目录1. mkdir : 创建目录2. rm : 删除目录3. mv : 移动、重命名目录4. cp :拷贝命令 一、概述 这里记录一下…

【Pytorch】16.使用ImageFolder加载自定义MNIST数据集训练手写数字识别网络(包含数据集下载)

数据集下载 MINST_PNG_Training在github的项目目录中的datasets中有MNIST的png格式数据集的压缩包 用于训练的神经网络模型 自定义数据集训练 在前文【Pytorch】13.搭建完整的CIFAR10模型我们已经知道了基本搭建神经网络的框架了,但是其中的数据集使用的torchvision…

Flutter 中的 WidgetInspector 小部件:全面指南

Flutter 中的 WidgetInspector 小部件:全面指南 Flutter 的 WidgetInspector 是一个强大的工具,它允许开发者在运行时检查和操作他们的 widget 树。这在调试复杂的布局和 widget 结构时尤其有用。本文将为您提供一个全面的指南,帮助您了解如…

Excel 按顺序去重再编号

Excel的A有重复数据: A1Cow2Chicken3Horse4Butterfly5Cow 现在要去除重复,用自然数按顺序进行编号,结果写在相邻列: AB1Cow12Chicken23Horse34Butterfly45Cow1 使用 SPL XLL,输入公式并向下拖: spl(&q…

RISC-V压缩指令扩展测试

概述 RISC-V定义了压缩指令扩展(compressed instruction-set extension ),命名为“C”扩展。压缩指令使用16位宽指令替换32位宽指令,从而减少代码量。这个C扩展可运用在RV32、RV64和RV128指令集上,通常使用“RVC”来表…