GIF 图像在隔行扫描时失真
GIF Image getting distorted on interlacing
我有一些图像是使用 Imagemagick 及其隔行扫描操作转换的。这些是 GIF 动画图像。问题是,在转换时,图像扭曲了,我没有原始图像,因为是以前的开发人员做了很棒的事情。 GIF 不再具有动画效果,每个帧都有 4 个相同帧的副本,尺寸逐渐减小。我之前没有在 Imagemagick 上做太多工作。
有什么办法可以把变形后的图片恢复原图吗?
使用的命令是:
convert <old-file.gif> -interlace plane <new-file.gif>
谢谢
interlaced GIF 图像存储为 4 个单独的图像
- 每第 8 行包含图像(大小的 1/8)
- 包含所有缺失的第 4 行图像(大小的 1/8)
- 包含图像中所有缺失的偶数行(大小的 1/4)
- 包含图像的每个奇数行(大小的 1/2)
这样做是为了在通过慢速 Internet 连接加载时可以看到图像...增加每个新块的细节...
因此,如果您的图像看起来像 4 张非常相似的图像,那么结果是可以的,您只是错误地解码了它,或者 GIF 没有设置隔行扫描标志。
如果您的文件不再包含动画帧,那么您就不走运了,但是如果它们在那里并且没有渲染,那么请检查文件的 GIF 结尾是否错位或检查标志,它们可能被搞砸了.. . 你有没有试过不同的 GIF 查看器(有些有问题)
[Edit1] 解码 GIF 之后
你得到了 GIF89a 并且你在每一帧中都缺少隔行扫描标志。所以图像是正确交错的,但观众认为它根本不是交错的......你需要在每个帧头中标记交错标志。
struct _img // this is image frame header
{
// Logical Image Descriptor
BYTE Separator; /* Image Descriptor identifier 0x2C */
WORD x0; /* X position of image on the display */
WORD y0; /* Y position of image on the display */
WORD xs; /* Width of the image in pixels */
WORD ys; /* Height of the image in pixels */
BYTE Packed; /* Image and Color Table Data Information */
} img;
img.Packed|=64; // this will set the interlaced flag
为此,您需要 decode/stream 复制 GIF,这并不像听起来那么容易。
见:
- Decode data bytes of GIF87a raster data stream
这里是帧复制+去隔行+隔行编码的结果(跳过control/info/auxiliary feeds ...)
我有一些图像是使用 Imagemagick 及其隔行扫描操作转换的。这些是 GIF 动画图像。问题是,在转换时,图像扭曲了,我没有原始图像,因为是以前的开发人员做了很棒的事情。 GIF 不再具有动画效果,每个帧都有 4 个相同帧的副本,尺寸逐渐减小。我之前没有在 Imagemagick 上做太多工作。
有什么办法可以把变形后的图片恢复原图吗?
使用的命令是:
convert <old-file.gif> -interlace plane <new-file.gif>
谢谢
interlaced GIF 图像存储为 4 个单独的图像
- 每第 8 行包含图像(大小的 1/8)
- 包含所有缺失的第 4 行图像(大小的 1/8)
- 包含图像中所有缺失的偶数行(大小的 1/4)
- 包含图像的每个奇数行(大小的 1/2)
这样做是为了在通过慢速 Internet 连接加载时可以看到图像...增加每个新块的细节...
因此,如果您的图像看起来像 4 张非常相似的图像,那么结果是可以的,您只是错误地解码了它,或者 GIF 没有设置隔行扫描标志。
如果您的文件不再包含动画帧,那么您就不走运了,但是如果它们在那里并且没有渲染,那么请检查文件的 GIF 结尾是否错位或检查标志,它们可能被搞砸了.. . 你有没有试过不同的 GIF 查看器(有些有问题)
[Edit1] 解码 GIF 之后
你得到了 GIF89a 并且你在每一帧中都缺少隔行扫描标志。所以图像是正确交错的,但观众认为它根本不是交错的......你需要在每个帧头中标记交错标志。
struct _img // this is image frame header
{
// Logical Image Descriptor
BYTE Separator; /* Image Descriptor identifier 0x2C */
WORD x0; /* X position of image on the display */
WORD y0; /* Y position of image on the display */
WORD xs; /* Width of the image in pixels */
WORD ys; /* Height of the image in pixels */
BYTE Packed; /* Image and Color Table Data Information */
} img;
img.Packed|=64; // this will set the interlaced flag
为此,您需要 decode/stream 复制 GIF,这并不像听起来那么容易。
见:
- Decode data bytes of GIF87a raster data stream
这里是帧复制+去隔行+隔行编码的结果(跳过control/info/auxiliary feeds ...)