golang中image包用法

本文介绍了Go语言中image包的使用,包括image接口、注册图像格式、Alpha、Gray等类型的详细方法,并通过示例展示了如何创建和操作图像,如设置透明度、灰度、子图像等。
摘要由CSDN通过智能技术生成

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 < dx; x++ {
		for y := 0; y < dy; y++ {
			alpha.Set(x, y, color.Alpha{uint8(x % 256)})   //设定alpha图片的透明度
		}
	}

	fmt.Println(alpha.At(400, 100))    //144 在指定位置的像素
	fmt.Println(alpha.Bounds())        //(0,0)-(500,200),图片边界
	fmt.Println(alpha.Opaque())        //false,是否图片完全透明
	fmt.Println(alpha.PixOffset(1, 1)) //501,指定点相对于第一个点的距离
	fmt.Println(alpha.Stride)          //500,两个垂直像素之间的距离
	jpeg.Encode(file, alpha, nil)      //将image信息写入文件中
}

得到的图形如下所示:



由于每种类型其方法类似,下面不再距离说明。

type Alpha16

type Alpha16 struct {
	// Pix holds the image's pixels, as alpha values in big-endian format. The pixel at
	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2]. 大端模式,所以像素计算和alpha不同
	Pix []uint8
	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
	Stride int
	// Rect is the image's bounds.
	Rect Rectangle
}
其中alpha16中方法用法与alpha中方法用法类似,这里不再赘述.
func NewAlpha16(r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值