热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang中image包用法

image包实现了一个基本的2D图像库,该包中包含基本的接口叫做image,这个里面包含color,这个将在imagecolor中描述,image接口的值创建方式有如下几种:1调用

image包实现了一个基本的2D图像库,该包中包含基本的接口叫做image,这个里面包含color,这个将在image/color中描述,

image接口的值创建方式有如下几种:

1调用NewRGBA和NewPaletted

2解码一个包含gif.jpen或者png格式的image数据的io.Reader

首先介绍一些image接口


type Image    //image是一个从颜色模型中采取color.Color的矩形网格

type Image interface {
	ColorModel() color.Model //ColorModel 返回图片的 color.Model
	Bounds() Rectangle    //图片中非0color的区域
	At(x, y int) color.Color  //返回指定点的像素color.Color
}
任何一个struct只要实现了image中的三个方法,便实现了image接口

func Decode(r io.Reader) (Image, string, error) //Decode对一个根据指定格式进行编码的图片进行解码操作,string返回的是在注册过程中使用的格式化名字,如"gif"或者"jpeg"等.


func RegisterFormat(name, magic string, decode func(io.Reader) (Image, error), decodeConfig func(io.Reader) (Config, error))

RegisterFormat注册一个image格式给解码使用,name是格式化名字,例如"jpeg"或者"png",magic标明格式化编码的前缀,magic字符串中能够包含一个?字符,用来匹配任何一个字符,decode是用来解码"编码图像"的函数,DecodeConfig是一个仅仅解码它的配置的函数.


type Alpha //用来设置图片的透明度

type Alpha struct {
	
	Pix []uint8  // Pix 存储图片的像素 ,像 alpha 值. 在(X,Y)的像素 starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
	
	Stride int          // Stride 表示垂直两个像素之间的步幅(距离)

	Rect Rectangle  // Rect 表示 图片边界.
}


func NewAlpha(r Rectangle) *Alpha       //利用给定矩形边界产生一个alpha
func (p *Alpha) AlphaAt(x, y int) color.Alpha      //获取指定点的透明度
func (p *Alpha) At(x, y int) color.Color   //获取指定点的color(指定点的红绿蓝的透明度)
func (p *Alpha) Bounds() Rectangle   //获取alpha的边界
func (p *Alpha) ColorModel() color.Model //获取alpha的颜色模型
func (p *Alpha) Opaque() bool      //检查alpha是否完全不透明
func (p *Alpha) PixOffset(x, y int) int   //获取指定像素相对于第一个像素的相对偏移量
func (p *Alpha) Set(x, y int, c color.Color) //设定指定位置的color
func (p *Alpha) SetAlpha(x, y int, c color.Alpha)  //设定指定位置的alpha

func (p *Alpha) SubImage(r Rectangle) Image   //获取p图像中被r覆盖的子图像,父图像和子图像公用像素

下面举例说明其用法:

package main

import (
	"fmt"
	"image"
	"image/color"
	"image/jpeg"
	"log"
	"os"
)

const (
	dx = 500
	dy = 200
)

func main() {

	file, err := os.Create("test.jpeg")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()
	alpha := image.NewAlpha(image.Rect(0, 0, dx, dy))
	for x := 0; x  
 

得到的图形如下所示:



得到的文件如下;



type RGBA64

type RGBA64 struct {
	// Pix holds the image's pixels, in R, G, B, A order and big-endian format. The pixel at
	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8].
	Pix []uint8
	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
	Stride int
	// Rect is the image's bounds.
	Rect Rectangle
}

func NewRGBA64(r Rectangle) *RGBA64
func (p *RGBA64) At(x, y int) color.Color
func (p *RGBA64) Bounds() Rectangle
func (p *RGBA64) ColorModel() color.Model
func (p *RGBA64) Opaque() bool
func (p *RGBA64) PixOffset(x, y int) int
func (p *RGBA64) RGBA64At(x, y int) color.RGBA64
func (p *RGBA64) Set(x, y int, c color.Color)
func (p *RGBA64) SetRGBA64(x, y int, c color.RGBA64)
func (p *RGBA64) SubImage(r Rectangle) Image


type Rectangle   //利用两个坐标点来生成矩阵

type Rectangle struct {
	Min, Max Point
}

func Rect(x0, y0, x1, y1 int) Rectangle //Rect是Rectangle{Pt(x0, y0), Pt(x1, y1)}的一种简写形式
func (r Rectangle) Add(p Point) Rectangle //矩阵中两个点都与指定的点求和组成一个新的矩阵
func (r Rectangle) Canon() Rectangle  //返回标准格式的矩形,如果有必要的话,会进行最小值坐标和最大坐标的交换
func (r Rectangle) Dx() int       //返回矩阵宽度dx
func (r Rectangle) Dy() int       //返回矩阵高度dy
func (r Rectangle) Empty() bool              //判定是否该矩阵为空,即不包含任何point
func (r Rectangle) Eq(s Rectangle) bool    //判断两个矩阵是否相等,指的是完全重合
func (r Rectangle) In(s Rectangle) bool  //判断一个矩阵是否在另外一个矩阵之内

func (r Rectangle) Inset(n int) Rectangle //返回根据n算出的嵌入的矩阵,计算方法是矩阵的每个坐标都减去n,求得的矩阵必须在已知矩阵内嵌,如果没有的话则返回空矩阵
func (r Rectangle) Intersect(s Rectangle) Rectangle     //求两个矩阵的相交矩阵,如果两个矩阵不相交,则返回0矩阵
func (r Rectangle) Overlaps(s Rectangle) bool  //判断两个矩阵是否有交集,即判断两个矩阵是否有公共区域
func (r Rectangle) Size() Point       //返回矩阵的宽和高,即dx和dy
func (r Rectangle) String() string                         //返回矩阵的字符串表示
func (r Rectangle) Sub(p Point) Rectangle  //一个矩阵的两个坐标点同时减去一个指定的坐标点p,得到的一个新的矩阵
func (r Rectangle) Union(s Rectangle) Rectangle //两个矩阵的并集,这个是和Intersect(求两个矩阵的交集)相对的


举例说明Rectangle用法:

package main

import (
	"fmt"
	"image"
)

func main() {
	rt := image.Rect(0, 0, 100, 50)
	rt1 := image.Rect(100, 100, 10, 10)

	fmt.Println(rt1.Canon())      //(10,10)-(100,100),rt1大小坐标交换位置
	fmt.Println(rt, rt1)          //(0,0)-(100,50) (10,10)-(100,100)
	fmt.Println(rt.Dx(), rt.Dy()) //100 50,返回矩阵的宽度和高度
	fmt.Println(rt.Empty())       //false,矩阵是否为空
	fmt.Println(rt.Eq(rt1))       //false,两个矩阵是否相等
	fmt.Println(rt.In(rt1))       //false,矩阵rt是否在矩阵rt1中
	fmt.Println(rt.Inset(10))     //(10,10)-(90,40),查找内嵌矩阵,用原矩阵坐标点减去给定的值10得到的矩阵,该矩阵必须是原矩阵的内嵌矩阵

	if rt.Overlaps(rt1) {
		fmt.Println(rt.Intersect(rt1)) //(10,10)-(100,50) //求两个矩阵的交集
	}
	fmt.Println(rt.Size())                //(100,50),求矩阵大小,其等价与(dx,dy)
	fmt.Println(rt.String())              //  (0,0)-(100,50)
	fmt.Println(rt.Sub(image.Pt(10, 10))) // (-10,-10)-(90,40),求矩阵和一个点的差,用于将矩阵进行移位操作
	fmt.Println(rt.Union(rt1))            //(0,0)-(100,100),求两个矩阵的并集
}

type Uniform     //Uniform是一个具有统一颜色无穷大小的图片,它实现了color.Color, color.Model, 以及 Image的接口

type Uniform struct {
	C color.Color
}

func NewUniform(c color.Color) *Uniform  //根据color.Color产生一个Uniform
func (c *Uniform) At(x, y int) color.Color             //获取指定点的像素信息
func (c *Uniform) Bounds() Rectangle    //获取图像的边界矩阵信息
func (c *Uniform) ColorModel() color.Model  //获取图像的颜色模型
func (c *Uniform) Convert(color.Color) color.Color //将图片的像素信息转换为另外一种指定的像素信息
func (c *Uniform) Opaque() bool         //判定图片是否完全透明
func (c *Uniform) RGBA() (r, g, b, a uint32)    //返回图片的r,g,b,a(红,绿,蓝,透明度)的值


type YCbCr  //YCbCr是一个Y'CbCr颜色的图片,每个Y样本表示一个像素,但是每个Cb和Cr能够代表一个或者更多的像素,YStride是在相邻垂直像素的Yslice索引增         //量,CStride是Cb和 Cr slice在相邻垂直像素(映射到独立色度采样)的索引增量.通常YStride和len(Y)是8的倍数,而CStride结果如下:

For 4:4:4, CStride == YStride/1 && len(Cb) == len(Cr) == len(Y)/1.
For 4:2:2, CStride == YStride/2 && len(Cb) == len(Cr) == len(Y)/2.
For 4:2:0, CStride == YStride/2 && len(Cb) == len(Cr) == len(Y)/4.
For 4:4:0, CStride == YStride/1 && len(Cb) == len(Cr) == len(Y)/2.

type YCbCr struct {
	Y, Cb, Cr      []uint8
	YStride        int
	CStride        int
	SubsampleRatio YCbCrSubsampleRatio
	Rect           Rectangle
}

func NewYCbCr(r Rectangle, subsampleRatio YCbCrSubsampleRatio) *YCbCr //通过给定边界和子样本比例创建新的YCbCr
func (p *YCbCr) At(x, y int) color.Color     //获取指定点的像素
func (p *YCbCr) Bounds() Rectangle     //获取图像边界
func (p *YCbCr) COffset(x, y int) int       //获取指定点相对于第一个Cb元素的像素点的相对位置
func (p *YCbCr) ColorModel() color.Model    //获取颜色Model
func (p *YCbCr) Opaque() bool                              //判定是否完全透明
func (p *YCbCr) SubImage(r Rectangle) Image  //根据指定矩阵获取原图像的子图像
func (p *YCbCr) YCbCrAt(x, y int) color.YCbCr  
func (p *YCbCr) YOffset(x, y int) int       //获取相对于第一个Y元素的像素点的相对位置


type YCbCrSubsampleRatio //YCbCr的色度子样本比例,常用于NewYCbCr(r Rectangle, subsampleRatio YCbCrSubsampleRatio)中用来创建YCbCr

const (
	YCbCrSubsampleRatio444 YCbCrSubsampleRatio = iota
	YCbCrSubsampleRatio422
	YCbCrSubsampleRatio420
	YCbCrSubsampleRatio440
)


func (s YCbCrSubsampleRatio) String() string //YCbCrSubsampleRatio结构的字符串表示

 

推荐阅读
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
author-avatar
tttt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有