【问题标题】:ImageMagick Convert BMP from 24 bit to 16 bit Mode?ImageMagick 将 BMP 从 24 位转换为 16 位模式?
【发布时间】:2015-12-15 19:53:48
【问题描述】:

我正在尝试在 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 位: 识别-详细

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

谢谢!

P。 S.

-深度值

图像的深度。这是一个像素中的位数。唯一可接受的值是 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 None -colors 256 /tmp/a/new/37_256_nd.bmp

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

【问题讨论】:

  • ppmtobmp 手册页同意 16 位 BMP 是不可能的...manpages.ubuntu.com/manpages/hardy/man1/ppmtobmp.1.html
  • 您真正想用 16-bpp BMP 做什么?也许你可以使用 PNG 或 NetPBM 的 PNM 格式,处理起来非常简单...en.m.wikipedia.org/wiki/Netpbm_format
  • 我总是喜欢当别人试图让我改变我的观点而不是回答时 :) 我想用 BMP 做什么?我需要 16 位 BMP 来存储旧游戏的屏幕截图,这些旧游戏使用 16 位图形而无需压缩,并且以无损方式和易于打开的格式。 Photoshop帮助了我。但是在 Linux 上它不起作用...
  • 请不要把试图帮助你的人误认为是告诉你改变主意的人。

标签: image-processing imagemagick imagemagick-convert imagemagick-identify


【解决方案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 图像开始并使用,当前的 ImageMagick(版本 6.9.2-8)会给我预期的 480kbyte 文件

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

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

【讨论】:

  • 感谢 Glenn 提到颜色深度定义 - 我正在搜索类似的信息,只是为了得出结论,深度代表每种颜色而不是全部(如您所提到的)花了我几个小时的搜索时间。但是,我仍在寻找 (a) ImageMagick.org 上 setImageDepth() 手册页的“官方”位置。我正在使用 php Imagick,其手册页非常简短(b)我想将图像的深度设置为 2(即,每个 RGB 颜色)并最终将其写为 PNG。似乎没有设置深度的影响 - 它最终以 8 位出现。有人可以帮忙吗?
  • PNG 格式不支持 RGB222 或 6 位索引,因此将写入为 RGB888 或 8 位索引,后者带有 64 项调色板。
  • 格伦,再次非常感谢。不支持 RGB222 的 PNG 格式是 Imagick/IM 的限制吗?我问这个是因为我在这里看到了这个:en.wikipedia.org/wiki/…“颜色深度可以在每像素 1 到 64 位之间。”如果是这样,是否有关于 PHP Imagick/IM 中每种文件格式支持各种深度的指针?我不一定需要使用 PNG 作为输出格式。
  • PNG 中定义的深度和颜色类型在这里定义:w3.org/TR/PNG/#11IHDR 和其他格式,ImageMagick 通常支持相应格式允许的任何深度。我认为 ImageMagick 文档中没有这些表格。
  • 好的。 ImageMagick 不能做我想做的事。我按回答关闭问题。
【解决方案2】:

不是ImageMagick,而是ffmpeg,更多的是与视频相关,如果你指的是565格式,可以创建16bit 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 源,那么它不应该抖动它们,但在进行任何批量转换之前,我会始终保持谨慎并仔细检查一些。

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

【讨论】:

  • 感谢您的建议。我的目标是存储图形图像而不进行任何压缩。 PNG 格式使用压缩。 BMP 格式似乎更适用于此目的。我将尝试获取有关该 565 格式的更多信息。
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多