ImageMagick将BMP从24位模式转换为16位模式



我正在尝试在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-详细

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

谢谢!

第页。S.

-深度值

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

=(

官方文件称(未提及限制):

-深度值

图像的深度。

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


转换/tmp/a/new/37.0bmp-颜色256/tmp/a/new/37_256.bmp

使文件变小,但在视觉上是一样的!wth?!))))


转换/tmp/a/new/37.bmp-颜色65536/tmp/a/new37_64k.bmp

同样的尺寸,同样的视觉画面。


转换/tmp/a/new/37.bmp-抖动无-颜色256/tmp/a/new/37_256_nd.bmp

又小了一点,但看起来不像256色!程序错误256色800x600 BMP为~800x600x1字节(无标头)~48万字节。但它说大约650 000字节)))有趣的程序))

您从linux.math…引用的文档非常旧(2001年),并且在深度方面不正确。"-深度16"选项并不意味着16位像素(如R5G6R5或R5G5R5A1)-深度16表示48位/像素R16、G16、B16或64位/像素R16、G116、B16、A16像素。您引用的"官方文件"(2015年)是正确的。

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

对于256色或更少颜色的图像,它将写入具有1、4或8位索引的颜色映射图像。你不必提出任何特殊要求,它会自动完成的。对未压缩的BMP使用"-compress none"。如果我从超过256色的800x600图像开始并使用,那么当前的ImageMagick(版本6.9.2-8)会为我提供预期的480kbyte文件

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

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

它不是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是逐字保存旧屏幕截图的好格式,因为它使用无损压缩,但可能由于使用老式软件而不适用?

最新更新