golang中image/draw包用法

前端之家收集整理的这篇文章主要介绍了golang中image/draw包用法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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,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"  http://blog.csdn.net/ison81/article/details/5468763 
 Porter-Duff 等式12种规则可以看这篇博客:"http://www.blogjava.net/onedaylover/archive/2008/01/16/175675.html" 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,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,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 main

import (
	"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,100,100))
	draw.Draw(jpg,img.Bounds().Add(image.Pt(10,10)),img,img.Bounds().Min,draw.Src) //截取图片的一部分
	jpeg.Encode(file,jpg,nil)

}
截取后的图片


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

package main

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

func main() {
	file,_ := jpeg.Decode(file1)

	jpg := image.NewGray(img.Bounds())                                 //NewGray

	draw.Draw(jpg,jpg.Bounds(),draw.Src) //原始图片转换为灰色图片

	jpeg.Encode(file,nil)

}
转换后效果图:


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

func main() {
	file,_ := 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,300,300))

	draw.Draw(jpg,img2,img2.Bounds().Min,draw.Over)                   //首先将一个图片信息存入jpg
	draw.Draw(jpg,img.Bounds().Min.Sub(image.Pt(0,0)),draw.Over)   //将另外一张图片信息存入jpg

	// draw.DrawMask(jpg,draw.Src) // 利用这种方法不能够将两个图片直接合成?目前尚不知道原因。

	jpeg.Encode(file,nil)

}

合成后图片如下:



参考:

蝈蝈俊博客http://www.cnblogs.com/ghj1976/p/3443638.html

golang官网:http://docscn.studygolang.com/pkg/image/draw/

猜你在找的Go相关文章