Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: 修复 RGB32 格式图像读取后预留通道被填充成 0xFF 的问题 #152

Closed
wants to merge 1 commit into from

Conversation

yixy-only
Copy link
Collaborator

@yixy-only yixy-only commented Apr 17, 2024

  • RGB32 格式为 32 位 RGB 格式,在 RGB24 的基础上添加一个不使用的字节,对齐 32 位从而加快处理速度。
  • RGB32 格式有时也会当做 ARGB 格式使用,将其预留通道视为透明通道。在 GDI+ 中,将 RGB32 格式转换成 ARGB 格式会将 alpha 通道赋值为 0xFF,丢失其原有数据。

默认:将 RGB32 格式视为 ARGB,保留其原有数据。

@yixy-only
Copy link
Collaborator Author

如果用户不希望将 RGB32 视为 ARGB,而是当做 RGB。考虑增加一个函数重载,读取图像时可以获取图像像素格式,用来区分 RGB32 和 ARGB。用户可以在判断出图像文件像素不是 ARGB 格式后,调用 ege_setalpha() 将 alpha 通道赋值为 0xFF。

@yixy-only yixy-only requested a review from chirsz-ever April 18, 2024 12:43
@chirsz-ever
Copy link
Collaborator

需要仔细考虑下,BMP 文件现在已经不常用了,BITMAPV4HEADER 是支持 alpha 通道的,这么改似乎不合法?

@yixy-only
Copy link
Collaborator Author

需要仔细考虑下,BMP 文件现在已经不常用了,BITMAPV4HEADER 是支持 alpha 通道的,这么改似乎不合法?

这个只是涉及到读取图像时,如果像素格式是 RGB32 怎么处理的问题,不是 BMP 图像。读取 RGB32 格式图像时,完整保留数据,包括未使用的字节,像素里这个字节可以交由用户来处理。用户可以继续保留当做 alpha 来使用,也可以使用 ege_setalpha() 覆盖掉 @chirsz-ever

@yixy-only
Copy link
Collaborator Author

BMP 保存成 RGB32 格式是无法保留透明通道的,虽然经过上面的设置可以在 EGE 中 使用,但是其它软件不认。所以还是用 BITMAPV4HEADER 或 BITMAPV5HEADER。 @chirsz-ever

@chirsz-ever
Copy link
Collaborator

虽然经过上面的设置可以在 EGE 中 使用,但是其它软件不认

我建议还是尽量遵守标准为好,最好增加带透明通道保存 PIMAGE 为 BMP 的方法(前几天想写1,但发现已有的代码只考虑了连续 RGB 数据,就放弃了),用 BITMAPV4HEADER 并设置压缩方法(bV4V4Compression)为 BI_BITFIELDS (3)就行 2)。

至于读到的 BMP 文件和格式,还是按标准来吧,真正的用 BITMAPV4HEADER 数据头的带透明度的 BMP 文件 EGE 现在应该能正常加载吧?

Footnotes

  1. https://pastebin.com/ZxaYk5tS

  2. https://en.wikipedia.org/wiki/BMP_file_format#Example_2

@yixy-only
Copy link
Collaborator Author

我先测一下,看了几个软件,BMP 保存都没有透明度选项的。下面是 PS,只有 RGB32,没有 ARGB
image

@yixy-only
Copy link
Collaborator Author

yixy-only commented Apr 20, 2024

对于 Windows BMP 图像格式,V3, V4 和 V5 Header 都支持 Alpha 通道。

  • V3: 属于非正式格式,无官方文档。大部分图像编辑器都无法识别出 V3 格式(无法打开,即使能打开也无法识别透明通道) 。
  • V4: 基本都支持,并且能正确识别出透明通道。
  • V5: 大部分支持,但有部分软件不能正确识别(能打开却无法识别出 Alpha 通道,如 PS)。

支持导出带 Alpha 通道 BMP 格式图像的软件不多,GIMP 支持 V3 和 V5。其它软件在导出 BMP 图像功能里暂时没找到 ARGB 格式选项。

格式转换的话,ARGB 格式的 PNG 转 BMP ,大部分软件会丢弃 Alpha 通道,以 V1 Header 的 RGB24 格式保存 BMP。

@yixy-only yixy-only closed this Apr 20, 2024
@yixy-only yixy-only deleted the fix_RGB32 branch April 24, 2024 11:32
@yixy-only yixy-only self-assigned this Apr 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants