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 的问题 的相关文章

  • 以 png 格式剪辑幻灯片 (Delphi 2010)

    I have a filmstrip of images in png format like this 我想知道如何剪辑每个图像并将这些图像放入 TImageList 控件中 并始终保留透明度 EDIT 是的 在设计时 RRUZ 提到的技
  • 为什么奇数的切片容量与偶数的切片行为不同

    我注意到 当容量为奇数时 切片的容量会以不同的方式表现 更具体地说 当向切片添加元素时 切片的容量为doubled当原始容量为偶数时 但当原容量为奇数时 容量为增加一 然后加倍 例子 s make int 28 28 s append s
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • C# MonoGame 有帮助吗? (Content.Load("入侵者");)

    我正在 MonoGame 中使用 Open GL 制作太空入侵者游戏 并且尝试加载已添加到内容文件夹中的纹理 这是一个名为 Invader 的 PNG 文件 我使用的代码是 invader Content Load
  • Golang 正则表达式命名组和子匹配

    我正在尝试匹配正则表达式并获取匹配的捕获组名称 当正则表达式仅与字符串匹配一次时 这是有效的 但如果它与字符串匹配多次 SubexpNames不返回重复的名称 这是一个例子 package main import fmt regexp fu
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon
  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • 模板中的 bson.ObjectId

    我有一个具有 bson ObjectId 类型的结构 例如如下所示 type Test struct Id bson ObjectId Name string Foo string 我想在 html 模板中呈现它 Name Food a h
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

    我想要来自不同子目录的分隔符逻辑模板templates文件夹 下面是我的templates文件夹 templates authentication login gohtml logout gohtml index gohtml profil
  • 在 Delphi 中淡入 alpha 混合 PNG 表单

    几年前 当 Vista 首次发布时 我曾提出过这个问题 但始终没有解决这个问题 并把它搁置起来 留待以后再考虑 我有一个启动屏幕 我花了很大力气让它看起来很棒 这是 32bpp alpha 混合的 PNG 我有一些代码 如果需要 我可以挖掘
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • 如何为所有 API 端点全局设置 http.ResponseWriter Content-Type 标头?

    我是 Go 新手 现在正在用它构建一个简单的 API package main import encoding json fmt github com gorilla mux github com gorilla handlers log
  • 什么时候返回结构体指针是个好主意?

    我正在学习 Go 我对何时使用指针有点困惑 具体来说 当返回一个struct从函数中 什么时候适合返回结构体实例本身 什么时候适合返回指向结构体的指针 示例代码 type Car struct make string model strin
  • golang.org 包和标准库之间的区别

    我使用 go 已经有一段时间了 我注意到 Go 标准库 和 golang org x 之间存在重复的包 我的问题是 为什么它们被释放两次 在这两者中 我应该使用哪一个 更新的 规范的等 到目前为止我注意到的一些示例包已发布两次 golang
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui

随机推荐

  • 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