博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang中image/draw包用法
阅读量:6447 次
发布时间:2019-06-23

本文共 3413 字,大约阅读时间需要 11 分钟。

draw包提供了图片的生成方法,或者绘制方法.其使用方法只需导入响应的包即可"import image/draw"

func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op)

Draw是DrawMask的一种特殊形式,当DrawMask方法中mask为nil时,便是Draw函数

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 对应的绘图开始点(绘制的大小 r变量定义了)    mask 是绘图时用的蒙版,控制替换图片的方式。    mp 是绘图时蒙版开始点(绘制的大小 r变量定义了) op Op is a Porter-Duff compositing operator.  参考文章:http://blog.csdn.net/ison81/article/details/5468763     Porter-Duff 等式12种规则可以看这篇博客:http://www.blogjava.net/onedaylover/archive/2008/01/16/175675.html

DrawMask将dst上的r.Min,src上的sp,mask上的mp对齐,然后对dst上的r型矩阵区域执行Porter-Duff合并操作。mask设置为nil就代表完全不透明。

type Drawer //Drawer中只含有一个Draw函数

type Drawer interface {	// Draw 根据 src 中的 sp 来对齐 dst 中的 r.Min,然后用在 dst 上画出 src	// 的结果来替换掉矩形 r	Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point)}
type Image

type Image interface {	image.Image	Set(x, y int, c color.Color)}
draw.Image实在image.Image基础上带有一个Set方法来改变一个单一的像素
type Op

type Op int,启用在Draw和DrawMask方法中const (    // Over说明``(在mask上的src)覆盖在dst上''。    Over Op = iota    // Src说明``src作用在mask上''。    Src)
func (op Op) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) //Draw 通过用此 Op 调用 Draw 函数实现了 Drawer 接口。

type Quantizer

type Quantizer interface {	// Quantize appends up to cap(p) - len(p) colors to p and returns the	// updated palette suitable for converting m to a paletted image.	Quantize(p color.Palette, m image.Image) color.Palette}

举例说明draw包的用法:

原始图片:

截取图片的一部分:

package mainimport (	"fmt"	"image"	"image/color"	"image/draw"	"image/jpeg"	"os")func main() {	file, err := os.Create("dst.jpg")	if err != nil {		fmt.Println(err)	}	defer file.Close()	file1, err := os.Open("20.jpg")	if err != nil {		fmt.Println(err)	}	defer file1.Close()	img, _ := jpeg.Decode(file1)	jpg := image.NewRGBA(image.Rect(0, 0, 100, 100))	draw.Draw(jpg, img.Bounds().Add(image.Pt(10, 10)), img, img.Bounds().Min, draw.Src) //截取图片的一部分	jpeg.Encode(file, jpg, nil)}
截取后的图片:

将原始图片转换为灰色图片:

package mainimport (	"fmt"	"image"	"image/color"	"image/draw"	"image/jpeg"	"os")func main() {	file, err := os.Create("dst.jpg")	if err != nil {		fmt.Println(err)	}	defer file.Close()	file1, err := os.Open("20.jpg")	if err != nil {		fmt.Println(err)	}	defer file1.Close()	img, _ := jpeg.Decode(file1)	jpg := image.NewGray(img.Bounds())                                 //NewGray	draw.Draw(jpg, jpg.Bounds(), img, img.Bounds().Min, draw.Src) //原始图片转换为灰色图片	jpeg.Encode(file, jpg, nil)}
转换后效果图:

利用draw实现两张图片合成:

func main() {	file, err := os.Create("dst.jpg")	if err != nil {		fmt.Println(err)	}	defer file.Close()	file1, err := os.Open("20.jpg")	if err != nil {		fmt.Println(err)	}	defer file1.Close()	img, _ := jpeg.Decode(file1)	file2, err := os.Open("10.jpg")	if err != nil {		fmt.Println(err)	}	defer file2.Close()	img2, _ := jpeg.Decode(file2)	jpg := image.NewRGBA(image.Rect(0, 0, 300, 300))	draw.Draw(jpg, jpg.Bounds(), img2, img2.Bounds().Min, draw.Over)                   //首先将一个图片信息存入jpg	draw.Draw(jpg, jpg.Bounds(), img, img.Bounds().Min.Sub(image.Pt(0, 0)), draw.Over)   //将另外一张图片信息存入jpg	// draw.DrawMask(jpg, jpg.Bounds(), img, img.Bounds().Min, img2, img2.Bounds().Min, draw.Src) // 利用这种方法不能够将两个图片直接合成?目前尚不知道原因。	jpeg.Encode(file, jpg, nil)}
合成后图片如下:

参考:

蝈蝈俊博客:

golang官网:

转载于:https://www.cnblogs.com/msnsj/p/4242569.html

你可能感兴趣的文章
groupbox 下的datagridview的列标题字体修改混乱
查看>>
HDU-3092 Least common multiple---数论+分组背包
查看>>
CentOS 7使用systemctl如何补全服务名称
查看>>
软件架构笔记 一
查看>>
hdu1421 搬寝室
查看>>
[转载]Linux命令笔记
查看>>
Unity3D NGUI 给button按钮添加单间事件
查看>>
C# 使用各种API
查看>>
echo命令的简单用法和实例
查看>>
CentOS7.4 KVM虚拟化之环境准备(1)
查看>>
《程序员代码面试指南》第八章 数组和矩阵问题 子矩阵的最大累加和问题
查看>>
密码的校验.大小写字母,数字,特殊字符中的至少3种
查看>>
hibernate常见错误
查看>>
FIN_WAIT_2状态解释
查看>>
ios 不同sdk4.3 6.0版本号,关于方法的兼容性的通用方法
查看>>
task20160125
查看>>
使用imp加载python模块
查看>>
Fibonacci Check-up
查看>>
FATE
查看>>
The Stable Marriage Problem
查看>>