Golang图片操作:如何进行图片的灰度化和亮度调整

1. 灰度化图片

在进行灰度化之前,我们需要了解一下图片的色彩模式。常见的图片色彩模式有RGB和灰度两种。RGB(红绿蓝)是三原色模式,每个像素点都是由三个颜色通道组成,每个通道颜色范围为0~255,代表了红、绿、蓝三个颜色的强度。而灰度模式则是一种只有灰度值的图像模式,每个像素点只有一个颜色通道,颜色范围为0~255,代表了黑到白的灰度程度。

下面是灰度化图片的代码:

package main

import (

"image"

"image/color"

"image/jpeg"

"os"

"golang.org/x/image/draw"

)

func main() {

// 读取原图片

file, err := os.Open("test.jpg")

if err != nil {

panic(err)

}

defer file.Close()

img, err := jpeg.Decode(file)

if err != nil {

panic(err)

}

// 将原始图片转换为灰度图

grayImg := image.NewGray(img.Bounds())

draw.Draw(grayImg, grayImg.Bounds(), img, image.ZP, draw.Src)

// 保存转换后的图片

outputFile, err := os.Create("gray_test.jpg")

if err != nil {

panic(err)

}

defer outputFile.Close()

jpeg.Encode(outputFile, grayImg, &jpeg.Options{Quality: 100})

}

首先,我们需要使用image包的Decode函数读取原图片。然后使用NewGray函数创建一张空的灰度图像,在使用draw包的Draw函数将原图片复制到灰度图像上。最后,使用jpeg包的Encode函数将转换后的灰度图保存到文件中。

需要注意的是,在实际操作中,我们需要根据具体的需求来选择图片的色彩模式。如果需要对色彩进行处理,那么RGB模式是更好的选择。如果只需要处理亮度或者灰度程度,那么灰度模式则更为适合。

2. 亮度调整

2.1 调整亮度算法

调整亮度的本质是将每个像素点的RGB通道值都进行加减操作,而不改变颜色的分布方式。具体地,对于一个RGB值为(r,g,b)的像素点,我们定义一个实数值delta来表示需要调整的亮度程度,代码如下:

func adjustBrightness(c color.RGBA, delta float64) color.RGBA {

r := uint8(float64(c.R) * delta)

g := uint8(float64(c.G) * delta)

b := uint8(float64(c.B) * delta)

return color.RGBA{r, g, b, c.A}

}

在颜色值的计算中,我们将delta与原始颜色分量相乘作为新的颜色分量。

2.2 图片亮度调整

现在,我们可以使用go语言代码来实现图片的亮度调整了。代码如下:

package main

import (

"image"

"image/color"

"image/jpeg"

"os"

)

func main() {

// 读取原图片

file, err := os.Open("test.jpg")

if err != nil {

panic(err)

}

defer file.Close()

img, err := jpeg.Decode(file)

if err != nil {

panic(err)

}

// 调整亮度

adjustedImg := image.NewRGBA(img.Bounds())

for x := 0; x < img.Bounds().Dx(); x++ {

for y := 0; y < img.Bounds().Dy(); y++ {

c := color.RGBAModel.Convert(img.At(x, y)).(color.RGBA)

adjusted := adjustBrightness(c, 1.2)

adjustedImg.Set(x, y, adjusted)

}

}

// 保存调整后的图片

outputFile, err := os.Create("brightness_test.jpg")

if err != nil {

panic(err)

}

defer outputFile.Close()

jpeg.Encode(outputFile, adjustedImg, &jpeg.Options{Quality: 100})

}

对于每个像素点,我们先将图片颜色转换为color.RGBA类型,然后调用adjustBrightness函数进行亮度调整,最后调用Set函数将新颜色设置到调整后的图片中。

需要注意的是,在实际操作中,我们需要根据需要进行适当的亮度调整。过高的亮度会导致图像过度曝光,影响观感。所以为了保证图像美观,我们需要选择适当的亮度调整程度。

后端开发标签