Alpha 通道(PNG) 和 Golang 的问题

2024-02-12

我在 golang 中的图像遇到一个简单的问题。我正在用颜色绘制 png 图像,但结果不是我想要的。

在 Alpha 值最低的像素中,绘制另一种颜色。我正在使用 alphaChannel = false

/* return new image with new color
 * alphaChannel = true get AlphaChannel from given color
 * alphaChannel = false get AlphaChannel from image (x,y) point
 */
func PaintPngImage(img image.Image, cl color.Color, alphaChannel bool) image.Image {
    R, G, B, A := cl.RGBA()
    composeImage := image.NewRGBA(img.Bounds())

    // paint image over a new image
    draw.Draw(composeImage, composeImage.Bounds(), img, image.Point{}, draw.Over)

    // paint new color over the image
    bounds := composeImage.Bounds()
    w, h := bounds.Max.X, bounds.Max.Y

    for x := 0; x < w; x++ {
        for y := 0; y < h; y++ {
            _, _, _, aa := composeImage.At(x, y).RGBA()
            if !alphaChannel {
                A = aa
            }
            realColor := color.RGBA{R: uint8(R),G: uint8(G),B: uint8(B),A: uint8(A)}
            if aa != 0 {
                composeImage.Set(x, y, realColor)
            }
        }
    }

    return composeImage
}

colorLayer := PaintPngImage(layerImage, cl, false)
out, err := os.Create("./output/test.png")
utils.ShowFatalError(err)
err = png.Encode(out, colorLayer)
utils.CloseFile(out) // close file os.Close
utils.ShowFatalError(err) // Show panic log if err != nil

Final: [1 https://i.stack.imgur.com/bQuKI.png]

如果我使用 jpeg.Decode 而不是 png.Decode 图像没有奇怪的颜色。


Color.RGBA() https://golang.org/pkg/image/color/#Color返回范围内的颜色分量0..0xffff,不在0..0xff:

// RGBA returns the alpha-premultiplied red, green, blue and alpha values
// for the color. Each value ranges within [0, 0xffff], but is represented
// by a uint32 so that multiplying by a blend factor up to 0xffff will not
// overflow.

因此,在构造要绘制的颜色时,您必须将所有 16 位分量右移(8 位),而不仅仅是转换为uint8因为该转换保留了最低 8 位,与 16 位值相比,这可能是“随机的”,并且您需要较高的 8 位:

realColor := color.RGBA{
    R: uint8(R>>8),
    G: uint8(G>>8),
    B: uint8(B>>8),
    A: uint8(A>>8),
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Alpha 通道(PNG) 和 Golang 的问题 的相关文章

  • GO中的优先级队列

    谁能向我解释一下 我想在GO中实现一个优先级队列 接口实现来自link https golang org pkg container heap example priorityQueue 但优先级最低 我的代码 pq make Priori
  • 无法从另一个标签的源代码构建和安装 go

    我正在尝试使用此从源代码构建和安装 go文档 https go dev doc install source 当我喜欢以下内容时 这效果很好 git clone https go googlesource com go goroot cd
  • Python 3.x 中的 PIL ImageTk 等效项

    我正在使用 Tkinter 开发一个应用程序 它使用以下数据库png图标的图像文件 为了在应用程序中使用所述图像 我使用 PIL 打开它们Image open 运行它通过ImageTk PhotoImage函数 然后将其传递给小部件构造函数
  • Three.js、自定义着色器和具有透明度的 png 纹理

    我有一个非常简单的 PNG 纹理 一个带有透明背景的灰色圆圈 我用它作为制服map for a THREE ShaderMaterial var uniforms THREE UniformsUtils merge basicShader
  • Go 编程 - 使用指针绕过访问权限

    假设我的项目有以下层次结构 fragment fragment go main go 并且在fragment go我有以下代码 只有一个 getter 没有 setter package fragment type Fragment str
  • ggmap雄蕊水彩png错误

    我真的很感谢一些关于我在 ggmap 和雄蕊水彩方面遇到的问题的帮助 想法 每次我尝试创建雄蕊水彩图时 我都会收到相同的错误消息 Error in readPNG destfile file is not in PNG format 以下是
  • golang sql 驱动程序的准备语句

    关于golang的sql driver 下面两条语句有什么区别 store DB is sql DB type rows err store DB Query SQL args err nil defer rows Close and st
  • GoLang - 坚持使用 ISO-8859-1 字符集

    我正在开发一个项目 我们需要将信息保存在具有 ISO 8859 1 表的旧数据库中 因此 在向数据库写入内容之前 我需要将其从 UTF 8 转换为 ISO 8859 1 每次从数据库检索它时 我都需要将其转换回 UTF 8 我试图使用图书馆
  • go 中的属性更改通知

    如何在 go 中向多个接收器发出 属性 更改信号 类似于在 Qt 中使用通知信号定义属性的方式 例如 如果您想象有一些值需要以多种方式显示 例如进度值可以同时显示为进度条和文本 当基础值发生变化时 两者都需要更新 一种方法可能是利用chan
  • Go API 在 html 中显示 swagger api 规范 (json) (Swagger UI)

    我有一个服务于特定端口的应用程序 gorilla mux 我也有一个 json 文件形式的 swagger API 规范 是否有任何 go API 可以像 spring boot 一样从 JSON 文件生成 swagger UI 定义 我正
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 取消用户特定的 goroutine [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个应用程序 网络应用程序 允许用户使用 twitter oauth 登录并提供自动推文删除功能 用户登录到 Web 应用程序后
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • 无法连接到代理“证书由未知机构签名”

    我正在尝试通过 Kubernetes 部署上的 cloudsql proxy 容器连接到 CloudSQL 实例 我已安装 cloudsql 凭据以及值GOOGLE APPLICATION CREDENTIALS set 但是 我的日志中仍
  • 我们如何在 Golang 中组合多个错误字符串?

    我是 golang 新手 我的应用程序需要在循环中返回多个错误 稍后需要组合并作为单个错误字符串返回 我无法使用字符串函数来组合错误消息 在返回之前可以使用什么方法将这些错误合并为一个错误 package main import fmt s
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • Gorm 总是返回带有 nil 值的结构

    我正在使用 Gorm 构建 Go Web API 作为 Amazon RDS 中 Postgresql 数据库的 ORM 问题是 Gorm 总是返回一片结构 其值全部为零 尽管数据库已经填充了数据 切片中的结构体数量是否合适取决于LIMIT
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • (转)如何使用toml文件?

    正如标题 我想知道如何使用 golang 中的 toml 文件 在此之前 我展示了我的 toml 示例 这样对吗 datatitle enable true userids 12345 67890 datatitle 12345 prop1

随机推荐

  • Chartjs - 在整数 x 轴值上绘制垂直线

    在下面的示例中 chartjs 注释使用字符串值 MAR 但不是整数值 如何在某个整数 x 轴值上绘制垂直线 var chartData labels JAN FEB MAR datasets data 12 3 2 window onlo
  • 致命错误:不在对象上下文解释中使用 $this?

    我遇到了这个奇怪的错误 这是我以前从未遇到过的 致命错误 不在对象上下文中使用 this Chat php 类
  • 避免 Spring AOP 中的就地切入点表达式

    我正在使用 Spring AOP 我给出的切入点如下 Pointcut execution com demo Serviceable public void serviceMethodCalls 是否可以避免 Spring AOP 中的就地
  • 使用正斜杠作为 ID 属性

    刚刚发现您可以使用 任何 unicode 字符作为 ID 属性 这为我打开了一个全新的世界 但我试图将 ID 属性设置为 name 并且它不想工作 这是我所得到的 http jsfiddle net z2xkm9pr http jsfidd
  • 如何获取Python模块中函数的行号(带/不带装饰器)?

    我想获取源代码中python函数的行号 我在运行时拥有的是模块 类 方法对象 看过检查 inspect getsourcelines object 这也给出了结果中的行号 我看到对于带有装饰器的方法 第 1 行 从上面的检查函数返回指向实际
  • 无法让 onSharedPreferenceChanged() 工作

    当用户从我的首选项活动中的列表首选项中选择特定项目时 我想显示一个对话框 但是 我无法让 onSharedPreferenceChanged 工作 我在方法的开头放了一个Toast 但它没有显示 所以方法根本没有运行完 这是为什么 这是我的
  • 更改微调器中所选项目的文本颜色

    如何更改微调器中所选项目的字体颜色 我可以更改所选项目的背景颜色 下拉项目的颜色等 但不能更改所选项目的文本颜色 我该怎么做 我的代码是 这是我正在使用的微调器
  • 如何使我的对象可重新解释转换为数组,例如 std::complex?

    我刚刚学到这个是因为这个问题 https stackoverflow com q 22919357 该标准规定std complex 26 4 复数 4 If z是类型的左值表达式cv std complex
  • C++17“内联变量”的新特性与继承自 C 的“extern”关键字的比较 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 两者有什么区别inline说明符和extern关键字何时应用于变量 extern表示变量定义驻留在其他地方的翻译单元中 inline对
  • 上传文件到S3时如何设置内容md5?

    当我将文件上传到 S3 时 我尝试设置 content MD5 值 我可以看到 md5 哈希字符串并将其传递到metadata setContentMD5 但是文件上传后 我在Web控制台中看不到这个值 也无法通过java代码检索它 我开始
  • C++ U32 类型标头

    我想用U32类型 但我找不到定义它的标头 有人知道吗 There is no standard type called U32 but if you include
  • 我应该对明显不能抛出异常的简单函数使用 noexcept 吗? [复制]

    这个问题在这里已经有答案了 Effective Modern C 第 14 条建议声明函数noexcept每当他们不发出异常时 我有一个包含许多小成员函数的类 这些函数由于非常微不足道的原因而无法抛出 例如他们只对 POD 执行简单的数学运
  • java堆空间错误导致eclipse挂起

    我在错误日志中收到此错误 并且我的 Eclipse 完全挂起 说我的 xml 布局文件有超过 80 个视图 现在为了携带一些页眉页脚和一些边框布局 我需要有这么多视图 这个问题有什么解决办法吗 eclipse buildId I201006
  • 对 RenderMvcController 进行单元测试甚至可能吗?

    所以我正在使用 Umbraco 6 12 并且很难测试RenderMvcController 我已经实施了IApplicationEventHandler in my Global ascx运行应用程序时 Ninject 工作正常且符合预期
  • 使用 kingfisher lib 插入授权标头字段

    我正在使用 Kingfisher 显示来自 url 的图像 但我的端点需要授权标头 如何在 iOS 中将此类 url 与 Kingfisher 或 SDWebImage 一起使用 使用 Kingfisher 您需要创建一个请求修饰符 类型为
  • 使用 java 的 Dynamodb 使用哪个 jar

    我正在尝试使用 Java 8 为 DynamoDB 编写 DAO 似乎有多种方法 类主要定义在以下两个包下 com amazonaws services dynamodbv2 software amazon awssdk services
  • Android 5.0+ AudioManager setMode 不起作用

    我正在开发 AudioManager 它是一个 Android SystemService 在 Android 系统 5 0 中 我遇到了 AudioManager 的 setMode 方法不起作用的问题 我通过测试 Android M L
  • unicode“感知”std::getline

    好吧 我正在测试如何编写一个 C 应用程序 该应用程序实际上可以读取 和更改 文本文件 同时尊重文本使用的编码 我希望 对于其他 API 将所有读取的文本显式转换为 UTF 8 以供内部使用 与文件中的实际编码无关 我在 Windows 上
  • .net 本地程序集加载因 CAS 策略失败

    我们收到以下程序集加载错误 该程序集是从本地路径 C Program Files ASWorx Products ASWorx Bin 加载的 旧版本的二进制文件不存在问题 当我们通过电子邮件发送新的二进制文件时 就会出现此问题 构建设置未
  • Alpha 通道(PNG) 和 Golang 的问题

    我在 golang 中的图像遇到一个简单的问题 我正在用颜色绘制 png 图像 但结果不是我想要的 在 Alpha 值最低的像素中 绘制另一种颜色 我正在使用 alphaChannel false return new image with