如何找到GIF图像中图像块从哪里开始?

2024-03-02

信息来源——http://www.onicos.com/staff/iz/formats/gif.html#header http://www.onicos.com/staff/iz/formats/gif.html#header

In GIFimages 实际图像尺寸(宽度、高度)存储在图像块中。据我所知图像块是标头中包含的第一个块。 在实际块开始之前,有一个称为全局颜色表(0..255 x 3 字节)(从现在开始GCT)。如果我能知道保留的字节数GCT我可以从中提取字节 5-9图像块并具有实际图像尺寸。

问题:我怎样才能知道/了解的尺寸是多少GCT?

OR

哪里有GCT end?

OR

哪里有图像块 begin?

OR

哪里有图像块 end?


您可以在这里找到 gif enc/dec 所需的一切3MF 项目 GIF http://www.matthewflickinger.com/lab/whatsinagif/lzw_image_data.asp

  1. GCT

    该块是可选的,并不总是出现在GIF文件。尺寸由颜色数量和位宽决定GIF标头。我像这样解码/加载它:

    struct _hdr
        {
        // Header
        BYTE Signature[3];      /* Header Signature (always "GIF") */
        BYTE Version[3];        /* GIF format version("87a" or "89a") */
        // Logical Screen Descriptor
        WORD xs;
        WORD ys;
        BYTE Packed;            /* Screen and Color Map Information */
        BYTE BackgroundColor;   /* Background Color Index */
        BYTE AspectRatio;       /* Pixel Aspect Ratio */
        } hdr;
    
    gcolor_bits= (hdr.Packed    &7)+1;  // global pallete
    scolor_bits=((hdr.Packed>>4)&7)+1;  // screen
    _gcolor_sorted =hdr.Packed&8;
    _gcolor_table  =hdr.Packed&128;
    scolors=1<<scolor_bits;
    gcolors=1<<gcolor_bits;
    
    • if _gcolor_table那么是真的GCT存在
    • GCT尺寸是3*gcolors[字节]按顺序存储R,G,B
  2. 图像开始

    这有点棘手,因为GIF89a文件可能包含许多可选块。您需要进行解码循环检测块的类型并根据其目的解码/跳过它。我这样做:

    struct _gfxext
        {
        BYTE Introducer;        /* Extension Introducer (always 21h) */
        BYTE Label;             /* Graphic Control Label (always F9h) */
        BYTE BlockSize;         /* Size of remaining fields (always 04h) */
        BYTE Packed;            /* Method of graphics disposal to use */
        WORD DelayTime;         /* Hundredths of seconds to wait    */
        BYTE ColorIndex;        /* Transparent Color Index */
        BYTE Terminator;        /* Block Terminator (always 0) */
        } gfx;
    
    struct _txtext
        {
        BYTE Introducer;        /* Extension Introducer (always 21h) */
        BYTE Label;             /* Extension Label (always 01h) */
        BYTE BlockSize;         /* Size of Extension Block (always 0Ch) */
        WORD TextGridLeft;      /* X position of text grid in pixels */
        WORD TextGridTop;       /* Y position of text grid in pixels */
        WORD TextGridWidth;     /* Width of the text grid in pixels */
        WORD TextGridHeight;    /* Height of the text grid in pixels */
        BYTE CellWidth;         /* Width of a grid cell in pixels */
        BYTE CellHeight;        /* Height of a grid cell in pixels */
        BYTE TextFgColorIndex;  /* Text foreground color index value */
        BYTE TextBgColorIndex;  /* Text background color index value */
    //      BYTE *PlainTextData;    /* The Plain Text data */
    //      BYTE Terminator;        /* Block Terminator (always 0) */
        };
    
    struct _remext
        {
        BYTE Introducer;        /* Extension Introducer (always 21h) */
        BYTE Label;             /* Comment Label (always FEh) */
    //      BYTE *CommentData;      /* Pointer to Comment Data sub-blocks */
    //      BYTE Terminator;        /* Block Terminator (always 0) */
        };
    
    struct _appext
        {
        BYTE Introducer;        /* Extension Introducer (always 21h) */
        BYTE Label;             /* Extension Label (always FFh) */
        BYTE BlockSize;         /* Size of Extension Block (always 0Bh) */
        CHAR Identifier[8];     /* Application Identifier */
        BYTE AuthentCode[3];    /* Application Authentication Code */
    //      BYTE *ApplicationData;  /* Point to Application Data sub-blocks */
    //      BYTE Terminator;        /* Block Terminator (always 0) */
        };
    // handle 89a extensions blocks
    _gfxext gfxext; gfxext.Introducer=0;
    _txtext txtext; txtext.Introducer=0;
    _remext remext; remext.Introducer=0;
    _appext appext; appext.Introducer=0;
    
    if((hdr.Version[0]=='8')
     &&(hdr.Version[1]=='9')
     &&(hdr.Version[2]=='a')) _89a=true; else _89a=false;
    
    if (_89a)
     for (;!f.eof;)
        {
        f.peek((BYTE*)&dw,2);
             if (dw==0xF921) { f.read((BYTE*)&gfxext,sizeof(_gfxext)); }
        else if (dw==0x0121) { f.read((BYTE*)&txtext,sizeof(_txtext)); for (;!f.eof;) { f.read(&db,1); if (!db) break; f.read(dat,DWORD(db)); } }
        else if (dw==0xFE21) { f.read((BYTE*)&remext,sizeof(_remext)); for (;!f.eof;) { f.read(&db,1); if (!db) break; f.read(dat,DWORD(db)); } }
        else if (dw==0xFF21) { f.read((BYTE*)&appext,sizeof(_appext)); for (;!f.eof;) { f.read(&db,1); if (!db) break; f.read(dat,DWORD(db)); } }
        else if ((dw&0x00FF)==0x0021) return; // corrupted file
        else break;                           // no extension found
        }
    
    • db是 BYTE 变量
    • dw是 WORD 变量
    • f是我的文件缓存类,成员是不言自明的,我希望无论如何:
    • f.read(&data,size) read size字节进入data
    • f.peek(&data,size)执行相同操作,但不更新文件中的位置
    • f.eof表示已到达文件末尾

    在所有图像标头开始之后,必须对每一帧执行此操作。

  3. 图片结尾

    图像块以终止符结束。所有图像块都以BYTE数数。如果是zero它是一个终止块。通常图像后面有几个BYTES不被使用LZW数据,因此在填充整个图像区域后,跳过所有块,直到达到零大小的块,然后停止,即图像结束。如果BYTE在这之后是0x3B十六进制,您已到达末尾GIF file

[notes]

不要忘记封装结构体#pragma pack(1) and #pragma pack()或手动设置align to 1 BYTE。当心有符号数据类型的问题(LZW数据是无符号的),因此可以在可以避免问题的地方进行重写,或者仅使用无符号变量(具有足够的位宽)进行解码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到GIF图像中图像块从哪里开始? 的相关文章

  • PHP 中的 imagecolortransparent 不起作用

    我想改变图像中的白色 http www arso gov si vreme napovedi 20in 20podatki radar gif http www arso gov si vreme napovedi 20in 20podat
  • 如何在android中使用parse api在parse服务器中上传图像

    我想在android中的解析云服务器中上传图像 但我无法这样做 我尝试过以下代码 Drawable drawable getResources getDrawable R drawable profilepic Bitmap bitmap
  • ABSMIDDLE 在 Firefox 和 Chrome 上的工作方式不同吗?

    我有一个图标图像和文本 如下所示 一切的代码来源是 img src align left My Title Here 问题在于 与 Firefox 相比 Chrome 中的图标没有与标题垂直对齐 我觉得absmiddle根本不起作用 有什么
  • 使用 OpenCV 和 Python 叠加两个图像而不丢失颜色强度

    如何叠加两个图像而不损失两个图像的颜色强度 我有图像1和图像2 2 我尝试使用 0 5 alpha 和 beta 但它给我的合并图像的颜色强度只有一半 dst cv2 addWeighted img1 0 5 img2 0 5 0 但是当我
  • 无需画布,用纯 JS 生成图像

    如何在没有画布的情况下用纯 JavaScript 无外部库 从像素数组生成 绘制图片 我尝试以URI形式生成图像但没有成功 图片格式不容易快速理解和实现 BMP 数据URI 您可以使用以下函数生成 BMP 位图 dataURI 24 位的
  • React Native 中文本的图像识别

    这可能是一个疯狂的问题 但我已经看到应用程序完成了 是否有任何类型的 API 可用于识别图像中的文本 Chase 识别支票上的数字的方式 或者是否有一个 API 可用于搜索 比如谷歌 基于图像的信息 例如 如果我拍了一张企业徽标的照片 谷歌
  • 如何向按钮添加动画 gif?

    你能告诉我如何在 C 中向按钮添加动画 gif 吗 仅仅通过将 gif 添加到资源并设置为按钮图像并不能很好地工作 下一个帧出现在前一个帧之上 问题似乎在于 c 如何处理透明度 但我不知道如何解决它 提前致谢 编辑 玩完 gif 后 问题出
  • Java:ImageIcon 与 Image 的区别

    谁能以菜鸟的方式向我解释一下两者之间有什么区别图像图标 and ImageJava 中的类 对象 谢谢 它们的性质和应用是不同的 Image http docs oracle com javase 6 docs api java awt I
  • 修补应用内购买黑客;卡在第四步

    正如我们许多人所知 苹果最近出现了一种情况 黑客可以免费获得任何应用内购买 苹果最近发布了这个文件 http developer apple com library ios releasenotes StoreKit IAP Receipt
  • 在android中通过BLE传输图像

    我使用以下代码传输 1 MB 的图像 如果在每个数据包之间实现线程延迟 则图像将成功传输 如果未设置线程延迟 则所有数据包均从BluetoothGattServer 发送 但BluetoothGattCallback 不会接收所有数据包 任
  • 调整图像的亮度、对比度和伽玛值

    在 NET 中调整图像的亮度 对比度和伽玛值的简单方法是什么 c and gdi have a simple way to control the colors that are drawn It s basically a ColorMa
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • JavaFX ImageView 未更新

    因此 我尝试将图像加载并保存到 imageView 中 其中图像的位置是通过文件浏览器选择的 我已经为此工作好几天了 如果我不能解决这个问题 我就会中风 我已经尝试了我能想到的一切 预先感谢您的帮助 UPDATED 这是我的主要课程 pub
  • 将 SVG 文件转换为多个不同大小的 PNG 文件

    我有一个 SVG 格式的徽标图像 我想知道是否有办法生成多个不同大小的 png 文件 例如 我设置了 20 个不同的宽度和高度 它会生成 20 个 PNG 文件 如果我必须一次处理 5 张图像也没关系 我已经安装了 illustrator
  • 通过 htaccess 将 PNG 解析为 PHP 仅适用于本地服务器,但不适用于网络服务器

    我用 PHP 创建了一个动态 PNG 图片 为了使用 PNG 扩展名 我创建了一个包含以下内容的 htaccess 文件 AddType application x httpd php png 在我的本地 XAMPP 服务器上 一切工作正常
  • 如何将图像转换为纹身? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我后来正在使用纹身应用程序 因为我需
  • 删除 WebView Android 中不需要的空白

    我已经开始使用 WebView 开发应用程序 实际上我正在使用 Webview 加载图像 我喜欢使用该类的内置缩放控件 我可以成功加载图像 但我可以看到一些令人恼火的空白 我找不到删除它的方法 我的图像尺寸为 750 1000 我在下面附上
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e

随机推荐