随机大小的均匀彩色图像的最小图像格式是啥?

Posted

技术标签:

【中文标题】随机大小的均匀彩色图像的最小图像格式是啥?【英文标题】:What's the smallest image format for randomly sized uniformly coloured images?随机大小的均匀彩色图像的最小图像格式是什么? 【发布时间】:2016-10-18 20:29:02 【问题描述】:

在不详细说明的情况下,我正在尝试将虚拟图像的 HTTP POST 发送到服务器,以使服务器在其数据库中创建图像的内部记录。该图像稍后将在存储中替换为应该在服务器不知道的情况下存在的实际图像。

不幸的是,这个服务器是“智能”的,它会验证发送给它的任何图像数据;如果它们与某些图像格式(例如 jpeg、gif、png 等)不匹配,它将拒绝随机字节。

当然,最明显的方法是发送尽可能小的 gif(1x1 灰色像素;~26 字节)。不幸的是,该服务器对其读取的图像的尺寸进行了不可变的记录……因此 1x1 像素的图像不会剪切它。

所以我的问题是,我可以作为假人发送的纯色的最小可能缩放图像是多少?理想情况下,由于压缩,这种格式的 100x100 像素的完全均匀的灰度图像应该与相同颜色的 1000x2000 图像大致相同。

(如果标签不是很好,请原谅我;我不确定应该去哪里)

【问题讨论】:

1000x1000 灰度像素的 PNG 或 GIF 有多大?比 26 字节大得多? 嗯。显然是的。 :-( 我猜 SVG 会起作用,但支持不是那么普遍(我想如果你不能改变服务器背后的尺寸,你也不能改变图像文件类型?) 哦,我没有想到 SVG。我会看看它是否接受它:) 我认为您需要描述更多有关设置的信息。我很困惑为什么服务器要存储尺寸,而不是图像格式(至少听起来是这样,如果您打算尝试使用 SVG,这将使得以后几乎不可能用一些照片类型的图像替换它)。如果除了尺寸之外没有存储任何内容,则 b&w 类型的单色 png 只有 733 字节 (1000x1000)。为什么太多了?还有为什么你可以访问服务器的存储,却不能更改服务器的图像处理检查? “纯色”是指不透明,还是只是一种统一的颜色?如果是这样,根据您的问题描述,为什么它需要不透明? 【参考方案1】:

您可以使用特制的 GIF 文件实现您想要的效果。

GIF format 允许您在文件开头的“逻辑屏幕描述符”部分中指定“逻辑屏幕宽度”和“逻辑屏幕高度”值,这些值定义了图像的大小。

但是,您实际上不需要对整个图像的像素进行编码,任何未编码的像素都被视为透明的。相反,GIF 文件包含一个或多个“图像描述符”部分,用于对图像子区域的像素进行编码。这用于压缩 GIF 动画(仅需要对与前一帧相比发生变化的图像的子区域进行编码),但它也可用于单帧图像。所以你可以做的只是输出一个单一的图像描述符编码图像的 1x1 透明像素区域,并设置你想要的图像大小的逻辑屏幕宽度和高度值,以创建一个任意大小的均匀透明的 GIF 图像,用于固定文件大小(42 字节)。

你只需要修改this transparent 1x1 pixel GIF的字节6-9(宽度)和字节10-13(高度)。请注意,GIF 使用 little-endian 字节顺序。

这是一个example file,一个 1024 x 1024 像素的透明 GIF 图片。

这个文件在 GIMP 图像编辑器中正确加载为 1k x 1k 透明图像,但一些文件查看器似乎将图像大小基于图像描述符的大小并将其显示为 1x1 像素,这是错误的据我所知。您必须测试您的服务器是否正确读取它们。

【讨论】:

谢谢!在阅读您的解决方案之前不久,我在阅读 GIF 规范后得出了同样的结论。只需在 GIF 标头中设置图像大小,然后为实际图像设置几个字节的垃圾似乎就足以欺骗服务器 :)

以上是关于随机大小的均匀彩色图像的最小图像格式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

png文件是啥格式?

python使用OpenCV加载彩色图像并把图像转化为YUV格式的彩色图使用equalizeHist算法增强彩色图像的对比度可视化对比度增强之后的彩色图像

图像格式

JPG格式与BMP格式是啥图片

用MATLAB实现图像的拼接显示

图片格式PGM缩写