2

我正在尝试在 ImageMagick 中将 BMP 从 24 位/像素模式转换为 16 位/像素模式。

convert /tmp/a/new/37.bmp -depth 5 -define bmp:format=bmp2 /tmp/a/new/37_v2_16bit.bmp
convert /tmp/a/new/37.bmp -depth 5 -define bmp:format=bmp3 /tmp/a/new/37_v3_16bit.bmp

根据以下输出:每 R.、每 G. 和每 B. 结果具有相同的 8 位:identify -verbose

我究竟做错了什么?如何在 BMP 中获得 16 位颜色?

谢谢!

附言

-深度值

图像的深度。这是一个像素中的位数。唯一可接受的值是 8 或 16。 http://linux.math.tifr.res.in/manuals/html/convert.html

=(

官方文档说(没有提到限制):

-深度值

图像的深度。

这是像素内颜色样本中的位数。使用此选项可指定深度未知的原始图像的深度,例如 GRAY、RGB 或 CMYK,或在读取任何图像后更改其深度。


转换 /tmp/a/new/37.bmp -colors 256 /tmp/a/new/37_256.bmp

使文件更小,但在视觉上它是相同的!怎么?!)))))


转换 /tmp/a/new/37.bmp -colors 65536 /tmp/a/new/37_64k.bmp

同样的大小,同样的视觉画面。


转换 /tmp/a/new/37.bmp -dither 无 -colors 256 /tmp/a/new/37_256_nd.bmp

又小了一点,但看起来不像256色!漏洞?256 个彩色 800x600 BMP 约为 800x600x1 字节(无标题)~ 480 000 字节。但它说〜650 000字节))))有趣的程序))

4

2 回答 2

1

您从 linux.math... 引用的文档很旧(2001 年),并且关于 -depth 的内容不正确。“-depth 16”选项并不表示 16 位像素(如 R5G6R5 或 R5G5R5A1);-depth 16 表示 48 位/像素 R16、G16、B16 或 64 位/像素 R16、G16、B16、A16 像素。您引用的“官方文档”(2015)是正确的。

ImageMagick 不支持那种 16 位/像素格式,因此您需要将它们存储为 8 位/通道格式并使用更大的文件大小。

似乎对于具有 256 或更少颜色的图像,它将写入具有 1、4 或 8 位索引的颜色映射图像。您不必提出任何特殊要求,它会自动完成。对未压缩的 BMP 使用“-compress none”。如果我从具有超过 256 种颜色的 800x600 图像开始并使用

convert im.bmp -colors 256 -compress none out.bmp

ImageMagick 在读取时确实支持 16 位“位域”BMP 格式,但我没有看到任何迹象表明它可以写入它们,也没有尝试读取或写入此类图像。

于 2015-12-20T22:20:20.443 回答
0

它不是ImageMagick ffmpeg,而是更多与视频相关的,如果您指的是565格式,可以创建16位bmp图像吗?

ffmpeg -i ffmpeg-logo.png -sws_flags neighbor -sws_dither none -pix_fmt rgb565 -y ffmpeg-logo-16bit-nodither.bmp

这故意禁用抖动,但如果你想要省略 sws 部分,例如

ffmpeg -i ffmpeg-logo.png -pix_fmt rgb565 -y ffmpeg-logo-16bit-dithered.bmp

如果您的图像本质上来自 rgb565 源,那么它不应该抖动它们,但在进行任何批量转换之前,我会始终保持谨慎并仔细检查一些。

根据评论中的讨论,听起来PNG是保存旧屏幕截图的好格式,因为它使用无损压缩,但由于与老式软件一起使用,这可能不适用?

于 2020-04-15T00:14:07.720 回答