go语言实现图像的灰度化

package main
import (
	"fmt"
	"image"
	"image/color"
	"image/gif"
	_ "image/gif"
	"image/jpeg"
	_ "image/jpeg"
	"image/png"
	_ "image/png"
	"log"
	"os"
	"strings"
)
func grayingImage(m image.Image) *image.RGBA {
    
     //灰度化图像。
	bounds := m.Bounds()
	dx := bounds.Dx()
	dy := bounds.Dy()
	newRgba := image.NewRGBA(bounds)
	for x := 0; x < dx; x++ {
    
    
		for y := 0; y < dy; y++ {
    
    
			colorRgb := m.At(x, y)
			_, g, _, a := colorRgb.RGBA()
			newG := uint8(g >> 8)
			newA := uint8(a >> 8)
			// 将每个点的设置为灰度值
			newRgba.SetRGBA(x, y, color.RGBA{
    
    R: newG, G: newG, B: newG, A: newA})
		}
	}
	return newRgba
}
func imageEncode(fileName string, file *os.File, rgba *image.RGBA) error {
    
    
	// 将图片和扩展名分离
	stringSlice := strings.Split(fileName, ".")
	// 根据图片的扩展名来运用不同的处理
	switch stringSlice[len(stringSlice)-1] {
    
    
	case "jpg":
		return jpeg.Encode(file, rgba, nil)
	case "jpeg":
		return jpeg.Encode(file, rgba, nil)
	case "gif":
		return gif.Encode(file, rgba, nil)
	case "png":
		return png.Encode(file, rgba)
	default:
		panic("不支持的图片类型")
	}
}
func main()  {
    
    
	imagePath := "C:\\Users\\wg\\go\\src\\学习go语言\\预处理\\家人们.png"
	file, _ := os.Open(imagePath)
	defer file.Close()//这个是方式防止忘记关掉。内存溢出。
	img, _, err := image.Decode(file)
	if err != nil {
    
    
		fmt.Println( err)
		return
	}
	b1 := img.Bounds()//获取边界
	img1Width := b1.Max.X //获取宽度
	img1Height := b1.Max.Y //获取高度
	fmt.Println(img)//输出 图像的像素
	fmt.Printf("%s", file.Name())//输出文件名字
	fmt.Printf("%d %d",img1Width, img1Height)//想要输出图像的高度和宽度  这里是(宽度,高度)
	//画一个图,矩形图片。恢复回原来的图。
	rect:=image.Rect(0, 0, img1Width, img1Height)
	// 新建一个 指定大小的 RGBA位图
	rgba := image.NewNRGBA(rect)
	for j:=0;j<img1Width;j++{
    
    
		for k:=0;k<img1Height;k++{
    
    
			rgba.Set(k,j,color.RGBA{
    
    uint8(k % 256), uint8(j % 256), 0, 255})//给图片上颜色。
			//实现图像灰度处理
		}
	}
	graychange := grayingImage(img)
	newFileName := "灰度.png"
	outFile, _ := os.Create(newFileName)
	defer outFile.Close()
	if err := imageEncode(newFileName, outFile, graychange); err != nil {
    
    
		panic(err)
	}
	//以png的格式保存文件
	imgfile, err := os.Create("family.png")
	if nil != err{
    
    
		log.Fatal(err)
	}
	err = png.Encode(imgfile, rgba)
	if nil !=err {
    
    
		log.Fatal(err)
	}
}


猜你喜欢

转载自blog.csdn.net/zhuiyunzhugang/article/details/121214205
今日推荐