当前位置: 首页 > 知识库问答 >
问题:

透明像素颜色-Go lang图像

戚云
2023-03-14

我试图从眼动跟踪结果创建一个热图(显示用户在屏幕上最频繁查看的位置)。

对于用户经常查看的像素,我想设置不透明的红色,对于不太频繁的橙色,等等...我使用红色到绿色的色阶。但是对于频率最低的像素,我希望它们不仅显示绿色,而且是透明的。

imgfile, err := os.Open("unchanged.jpeg")
defer imgfile.Close()
if err != nil {
    fmt.Println(err.Error())
}

decodedImg, err := jpeg.Decode(imgfile)
img := image.NewRGBA(decodedImg.Bounds())

size := img.Bounds().Size()
for x := 0; x < size.X; x++ {
    for y := 0; y < size.Y; y++ {
        img.Set(x, y, decodedImg.At(x, y))
    }
}

// I change some pixels here with img.Set(...)

outFile, _ := os.Create("changed.png")
defer outFile.Close()
png.Encode(outFile, img)

问题是,当我尝试改变颜色时,例如使用img。设置(x,y,颜色。RGBA{85, 165, 34, 50})它实际上并没有根据新旧颜色将像素作为平均值着色,它只是显示一些新的、看起来奇怪的颜色。

图像与alpha RGBA值设置为50:(透明)

图像与alpha RGBA值设置为255:(不透明)

我使用的是png图像,据我所知,它确实支持透明度。为什么会这样?有什么办法可以解决这个问题,让最不常见的像素看起来透明?

谢谢你的回答。

共有1个答案

宗政英才
2023-03-14

这是因为Set()方法在指定位置设置(覆盖)像素的颜色。这不是你想要的。

您希望将像素的原始颜色与您选择的颜色相结合,并希望这是最终颜色。

为了实现这一点,首先您可以使用Image查询原始颜色。在()处,然后将颜色与您想要的任何颜色组合(您可以分别通过红色、绿色、蓝色和阿尔法通道来实现),并使用Set()方法设置最终颜色。

结合:

请注意,颜色的RGBA字段。RGBA struct是alpha预乘值,这意味着R字段保存颜色的红色分量乘以alpha通道的值。

您可以使用RGBA。RGBA()方法,它将所有字段作为uint32值返回,并且所有字段都将在0的范围内。。0xffff这样,您就可以对它们执行操作,而不必担心溢出(uint8的最大值是255,因此即使添加两个,也很容易溢出)。

因此,当您组合两种颜色时,可以按组件组合。但是请注意颜色中这些字段的类型。RGBAuint8,因此在组合后,必须将结果转换为8位,因此必须右移8位。

一个非常简单的组合:计算平均值:

// Query:
x, y := 1, 1
r, g, b, a := img.At(x, y).RGBA()

// Combine:
col := color.RGBA{85, 165, 34, 50}
r2, g2, b2, a2 := col.RGBA()

col.R = uint8((r + r2) >> 9) // div by 2 followed by ">> 8"  is ">> 9"
col.G = uint8((g + g2) >> 9)
col.B = uint8((b + b2) >> 9)
col.A = uint8((a + a2) >> 9)

// Set new pixel:
img.Set(x, y, col)

您可以将其合并到助手函数中:

func combine(c1, c2 color.Color) color.Color {
    r, g, b, a := c1.RGBA()
    r2, g2, b2, a2 := c2.RGBA()

    return color.RGBA{
        uint8((r + r2) >> 9), // div by 2 followed by ">> 8"  is ">> 9"
        uint8((g + g2) >> 9),
        uint8((b + b2) >> 9),
        uint8((a + a2) >> 9),
    }
}

使用它:

x, y := 1, 1
img.Set(x, y, combine(img.At(x, y), color.RGBA{85, 165, 34, 50}))

如果你需要真实的颜色合成,请查看Alpha合成页面。

 类似资料:
  • 问题内容: 我有一个Android应用程序,可将图像加载为位图并将其显示在ImageView中。问题在于图像似乎具有透明背景;这会导致图像上的某些黑色文本在黑色背景下消​​失。 如果将ImageView背景设置为白色,则可以完成这种工作,但是在图像上会出现丑陋的大边框,将其拉伸以适合父对象(实际图像在中间缩放)。 所以-我想将位图中的透明像素转换为纯色-但我不知道该怎么做! 任何帮助将不胜感激!

  • 问题内容: 但是我需要一个Java等效项。我需要一个图像类型(如,,…),该图像类型可以完全透明(alpha = 0)保留此颜色。当然还有一种将其保存为文件的方法。 问题答案: import java.awt.; import java.awt.image. ; 修改代码以使每个像素透明 来源:http://www.rgagnon.com/javadetails/java-0265.html

  • 问题内容: 我有一个DIV,我想放置一个图案作为背景。此图案是灰色的。为了使它更好一点,我想在上面放一个透明的颜色“层”。以下是我尝试过的方法,但是没有用。有没有办法将彩色图层放在背景图像上? 这是我的CSS: 问题答案: 这里是: 对此的HTML: 当然,如果其中没有其他元素,则需要为该类定义宽度和高度

  • 问题内容: 我想打开jpeg图像文件,对其进行编码,更改一些像素颜色,然后将其保存回原样。 我想做这样的事情 我只是想不出一个可行的解决方案,因为编码图像文件后获得的默认图像类型没有Set方法。 谁能解释该怎么做?非常感谢。 问题答案: 成功解码后(以及特定的解码功能,如),返回的值。是一个接口,用于定义图像的只读视图:它不提供更改/绘制图像的方法。 该软件包提供了几种实现方式,这些实现方式通常允

  • 我试着用特定的透明颜色在Android画布中显示一个jpg。它与png配合得很好,我也知道如何用java将jpg转换为png,所以最后我在文件系统上有了一个新的png文件。 现在我的问题是:有没有办法从文件系统读取jpg文件,在运行时设置透明颜色(转换为png)并在运行时显示图像? 附加注释:我尝试在自定义视图中使用ondraw方法和drawbitmap来实现这一点。我不能使用imageview:

  • 我注意到在具有透明背景的图像上使用CSS颜色变换会产生意想不到的效果。下面是一个示例: 总而言之,问题是这样的。如果将鼠标悬停在image div div的填充上,则此div的背景色和包含的image div以与预期相同的速率执行颜色转换。但是,如果将鼠标悬停在图像div上,其颜色的过渡速度似乎略快于图像div div的颜色。 鉴于我能够在Firefox、Chrome、Safari和Edge上重现