【问题标题】:Delphi 7 Glyph.Data Hex to Data URI [closed]Delphi 7 Glyph.Data Hex 到数据 URI [关闭]
【发布时间】:2016-06-07 08:31:14
【问题描述】:

我正在尝试将 Delphi-7 ui 转换为 Web 界面。 Delphi 将按钮图标作为十六进制字符串存储在 Glyph.Data 属性中。例如:

object Btn1: TSpeedButton
        Left = -1
        Top = -1
        Width = 26
        Height = 27
        Anchors = [akTop, akRight]
        Flat = True
        Glyph.Data = {
          36060000424D3606000000000000360000002800000020000000100000000100
          1800000000000006000000000000000000000000000000000000BECACDBECACD
          BECACDBECACDBECACDBECACDD9D3E6BAB4E3E8E2E8BECACD9A96DE0000CC0000
          CC5E5BD6BECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD8D
          A2A7BECACDBECACDBECACD8C8C8C8C8C8C8DA2A7BECACDBECACDBECACDBECACD
          BECACDBECACDBECACDD9D3E6100FCD0000CC100FCDE8E2E93E3DD20000CC0000
          CC0000CCBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD64646464
          6464646464BECACD8C8C8C646464646464646464BECACDBECACDBECACDBECACD
          BECACDBECACDBECACDBAB4E40000CC0000CC0000CCBAB4E44E4CD60000CC0000
          CC100FCDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD64646464
          64646464648DA2A78C8C8C646464646464646464BECACDBECACDBECACDBECACD
          BECACDBAB4E4D9D3E6E8E2E91F1ECF0000CC2F2ED0BECACDC9C3E54E4CD63E3D
          D2AAA5E0BECACDBECACDBECACDBECACDBECACD8DA2A78DA2A7BECACD64646464
          6464646464BECACDBECACD8C8C8C8C8C8C8DA2A7BECACDBECACDBECACDBECACD
          6D6AD90000CC0000CCBAB4E4BECACDC9C3E5BECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACD8DA2A76464646464648DA2A7BECACDBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          3E3DD20000CC0000CC7B78DBBECACDBECACDBECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACD8C8C8C6464646464648DA2A7BECACDBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          AAA5E01F1ECF3E3DD2D9D3E6BECACDBECACDBECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACD8DA2A7646464646464BECACDBECACDBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          BECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          2F2ED00000CC8B87DDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACD646464646464646464BECACDBECACDBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          0000CC0000CC3E3DD2BECACDBECACDBECACDBECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACD646464646464646464BECACDBECACDBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          6D6AD93E3DD2AAA5E0BECACDBECACDBECACDBECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACD8C8C8C6464648DA2A7BECACDBECACDBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          BECACDBECACDBECACDBAB4E4BECACDBECACDBECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD8C8C8CBECACDBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          BECACDBECACD4E4CD60000CC7B78DBBECACDBECACDBECACDBECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACDBECACDBECACD6464646464648C8C8CBE
          CACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          BECACDBECACD4E4CD60000CC7B78DBE8E2E98B87DDC9C3E5BECACDBECACDBECA
          CDBECACDBECACDBECACDBECACDBECACDBECACDBECACD6464646464648C8C8CBE
          CACD6464648DA2A7BECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD
          BECACDBECACDE8E2E9BAB4E4BECACD8B87DD0000CC3E3DD2BECACD7B78DB4E4C
          D6BECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACD8DA2A7BECACD64
          6464646464646464BECACD6464646464648C8C8CBECACDBECACDBECACDBECACD
          BECACDBECACDBECACDBECACDBECACDD9D3E63E3DD29A96DEBECACD4E4CD60000
          CCD9D3E6BECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBECACDBE
          CACD6464648C8C8CBECACD6464646464648C8C8CBECACDBECACD}
        NumGlyphs = 2

如何将此字符串转换为 HTML 的数据 URI?我试图将其转换为字节数组以从中制作位图,但这也失败了。我编写了一个小的 C# Helper 工具来进行对话,但我无法让它运行。它会在 Image.FromStream(ms) 上抛出 ArgumentException。

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] bytes = StringToByteArray(textBox1.Text);
        byte[] newBytes = new byte[bytes.Length - 4];
        for(var i = 4; i < bytes.Length; i++)
        {
            newBytes[i - 4] = bytes[i];
        }
        using (var ms = new MemoryStream(bytes))
        {
            Image image = Image.FromStream(ms);
            pictureBox_originalImage.Image = image;
        }
    }
    public static byte[] StringToByteArray(String hex)
    {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }

提前致谢。

【问题讨论】:

  • using (var ms = new MemoryStream(bytes)) 应该指的是newBytes,不是吗?
  • 是的,@TomBrunberg 是正确的。如果您进行一些基本的调试,这种事情很容易被注意到。在我看来,从我在 SO 上的所有经验来看,现代开发人员非常缺乏基本的调试技能。我并不是指使用 IDE 调试器的实用技能。我的意思是知道要检查哪些信息才能诊断出故障所在的更高级别的技能。
  • 是的,我明白了。我确实使用了 newBytes,但在发布此内容之前,我还想看看如果我改用字节会发生什么,只是忘记在发布之前再次将其关闭。开发代码不是我的职业。

标签: c# html delphi delphi-7


【解决方案1】:

执行以下操作以从此 Delphi 表单文件中提取 Windows 位图:

  1. 读取十六进制字符串。
  2. 将十六进制字符串转换为二进制(字节数组)。如果使用 Delphi,您可以使用 Classes 单元中的 HexToBin 执行此操作。如果使用其他语言,则必须使用适当的函数将十六进制转换为二进制。
  3. 从字节数组中删除前 4 个字节。这些被删除的字节包含剩余字节的长度。
  4. 将这些字节保存到文件中。

您保存的是一个 Windows 位图文件。您可能希望转换为对网络友好的格式,例如 PNG,但我想您已经有了执行此操作的工具。

最后,您需要将该 PNG 文件编码为 base64,从而形成一个数据 URI。同样,我假设您知道如何做到这一点。

在您提供的示例中,您还可以看到NumGlyphs 属性表示字形包含两个图像。您可能希望将提取的位图拆分为多个图像。

【讨论】:

  • 谢谢,我尝试删除前 4 个字节,但我想我尝试保存的不是有效图像。我在我的问题中发布了代码。
  • 做一些调试。在十六进制编辑器中查看输出文件。是你所期望的吗?
【解决方案2】:

请原谅我的英语很糟糕。

有两种选择。

1) 使用没有空格的文件文本 使用使用 readln 的算法/函数。 我在下面发布了这个方法

2) 我已经实现了一些完美运行的功能

function HexaBmp(const aSource, aDest: String): 整数; // 完毕 函数 BmpHexa(const aSource, aDest: String): 整数; // 完成工作 函数 Bin2Bin(const aSource, aDest: String): 整数; // 工作完成(二进制文本中的二进制) 函数 Txt2Bin(const aSource, aDest: String): 整数; //(二进制中的二进制文本)正在进行中...

这个函数使用这个子函数...

程序阅读; 开始 块读取(F1,PFBuf^,SIZEFB,字节) 结束;

程序编写; 开始 BlockWrite(F2, BLWR, Z, BytesOut) 结束;

但出于版权原因,请勿发布此内容(我不明白我是否会成为这些内容的所有者) 抱歉……我无法解释更多。它更加复杂。 需要一个复杂且稳健的算法,但速度非常快。

但不用担心,因为您可以在下面使用我的这个小程序来处理使用第一种方法的范围。

program HexaToBmp;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

const
  CHX: array ['0'..'F'] of Byte = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15);

var
  FtoW: TextFile;
  FtoR: TextFile;
  WFile: String;     // name of write file
  Buff: String;      // string buffer of read file
  vS: String;        // calc string
  FNY: Word;         // final Y
  M: Word;           // prior of Y
  Y: Word;           // in loop while read index

  procedure TextSeek(var aFtx: Text; POS: Cardinal);
  begin
    with TTextRec(aFtx) do
    begin
      BufPos:= 0;
      BufEnd:= 0;
      SetFilePointer(Handle, POS, nil, FILE_BEGIN)
    end
  end;

begin
  WFile:= StringReplace(ParamStr(1), ExtractFileExt(ParamStr(1)), 'WF', []) + '.bmp';
  AssignFile(FtoR, ParamStr(1));
  AssignFile(FtoW, WFile);
  vS:= '';

  try
    Reset(FtoR);
    ReWrite(FtoW);
    TextSeek(FtoR, 8);            // position after the first 8 byte

    while not EOF(FtoR) do
    begin
      Readln(FtoR, Buff);
      FNY:= Length(Buff) + 1;
      M:= 1;
      Y:= 2;

      while Y < FNY do
      begin
        if Buff[Y] = #$A then   // new line jump
        begin
          Write(FtoW, vS);      // writing current line
          vS:= '';
          Y:= Y + 1             // jump correct index
        end
        else
          vS:= vS + Chr(16 * CHX[Buff[M]] + CHX[Buff[Y]]);   // calc bin value

        M:= Y + 1;             // increment the variable values
        Y:= M + 1
      end
    end;

    Write(FtoW, vS)
  finally
    CloseFile(FtoR);
    CloseFile(FtoW)
  end

end.
`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多