gpt4 book ai didi

image - 使用 image.Image 或 *image.RGBA 的 Set() 方法

转载 作者:IT王子 更新时间:2023-10-29 00:52:33 25 4
gpt4 key购买 nike

我在今年夏天的空闲时间使用 Go 镜像包进行一些练习。

package main

import (

"os"
"image"
"image/png"
"image/color"
"log"
"fmt"
"reflect"

)

func main(){

file , err := os.OpenFile("C:/Sources/go3x3.png", os.O_RDWR, os.FileMode(0777))
if err != nil {
log.Fatal(err)
}

img , err := png.Decode(file)
if err != nil {
log.Fatal(err)
}


img.At(0,0).RGBA()
fmt.Println("type:", reflect.TypeOf(img))

m := image.NewRGBA(image.Rect(0, 0, 640, 480))
fmt.Println("type:", reflect.TypeOf(m))
m.Set(5, 5, color.RGBA{255, 0, 0, 255})
img.Set(0, 0, color.RGBA{136, 0, 21, 255})
}

这里的问题是,当我在 img.Set 注释掉的情况下运行它时,我得到了这个结果

type: *image.RGBA
type: *image.RGBA

但是当它被取消注释时我得到一个错误提示

img.Set undefined (type image.Image has no field or method Set)

我假设我使用的反射是错误的,我仍然完全掌握 Go 中的整个接口(interface)和类型定义。

最佳答案

展开 a previous answer answer :

png.Decode可以创建几种不同的底层图像类型之一(*image.Gray*image.RGBA*image.Paletted* image.NRGBA 等)。它返回它创建的任何图像作为 image.Image 接口(interface),该接口(interface)提供对数据的只读访问

但是,它返回的所有(大多数?)实际图像类型都实现了用于简单写访问的 Set 方法。您可以安全地测试和使用此方法的方法是通过现有的 draw.Image image/draw 包中的接口(interface)。就是这样:

// From image/draw:
// Image is an image.Image with a Set method to change a single pixel.
type Image interface {
image.Image
Set(x, y int, c color.Color)
}

所以你可以这样做:

func drawablePNGImage(r io.Reader) (draw.Image, error) {
img, err := png.Decode(r)
if err != nil {
return nil, err
}
dimg, ok := img.(draw.Image)
if !ok {
return nil, fmt.Errorf("%T is not a drawable image type", img)
}
return dimg, nil
}

Playground (显示调用所有 image.Image 方法以及 Set 的示例)。

为 Go1.17+ 编辑:

注意 Go1.17 添加了 draw.RGBA64Image使用 SetRGBA64 方法。与 draw.Image 一样,所有标准图像类型都实现了这一点。此方法的优点是颜色值未装箱在 color.Color 接口(interface)类型中,因此可以更快地执行许多像素操作。另请注意 Go1.18 added optimisationsdraw.Draw and draw.DrawMask实现可选 draw.RGBA64Imageimage.RGBA64Image 的图像的回退实现接口(interface)。

关于image - 使用 image.Image 或 *image.RGBA 的 Set() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30227947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com