【问题标题】:Delphi XE7 TBitBtn Image wrong Displayed at run timeDelphi XE7 TBitBtn Image wrong 运行时显示
【发布时间】:2015-02-25 03:51:44
【问题描述】:

我有一个使用 Delphi 7 和 VCL 开发的项目,无需任何修改即可编译和使用新的 Delphi XE7,我遇到的唯一问题是 TBitBtn 的字形图像显示错误(如您所见,颜色和位置不一样)在运行时,尽管在设计时显示良好。

设计时间

运行时间

什么会导致问题?

注意

使用旧的 Delphi 7 我没有这个问题:图像在设计和运行时都正确显示。

紧随 dfm 中 Glyph 数据的前 3 行:

Glyph.Data = {
  36050000424D3605000000000000360400002800000010000000100000000100
  080000000000000100000000000000000000000100000000000000164900001C
  4D0000275700003C7100003D6E00004483000046760000467B0000548C00005B
  ...

在 Delphi 7 和 Delphi XE7 中是一样的。

如果我单击 TBitBtn 的 Glyph 属性,我可以在对话框中看到图像(错误的图像),如果我用 OK 确认,IDE 会以这种方式更改 DFM 文件中的 Glyph 属性(差异输出):

     Glyph.Data = {
-      36340000424D3638000000000000360800002800000040000000400000000100
-      1800000000000030000000000000000000000001000000000000724242007B47
-      47007D4849007E4C4B00804C4C0081524F008155500083535200845754008458
-      56008459590085525200855B5700875D58008B6260008B6361008B6362008C65
-      63008C6664008D615C008D6665008D6766008E5A5A008F696800906B6A00916C
-      6B00935F5F00936F6E0094616100946F6F00957170009773730097747400986A
-      6600997777009C7B7B009E7D7D009F6B6B00A06C6C00A1818100A26E6E00A37B
-      7400A3817600A4707000A6727200A67C7600A6867A00A7737300A7877B00A983
-      7B00AA8E8E00AB8C7F00AC8A7F00AC8F8F00AE918300AE939300AF959500B190
-      8400B1958700B2999900B37F7F00B49B9B00B79F9F00B8848400B89FA000BA86
-      8600BB878700BBA5A500BC888800BE8A8A00C08B8B00C18D8D00C1A89700C2AD
-      AD00C38F8F00C4A69800C5919100C7929200C8939300C9949400CA959500CB95
-      9600CB969600CCA79D00CDA49D00CF999A00CFBBA700D09D9C00D0BCA700D0BC
-      A800D0BDA900D19C9C00D1BDA900D29F9E00D39E9E00D3AAA300D49F9F00D4B2
-      A700D4C1AC00D4C1AD00D4C2AD00D4C5C500D6ABA500D6C8C800D7ADA700D7C5
-      B000D8AFA800D8C7B000D8C7B100D8CACB00D9B1A900D9BEAE00DAB2AA00DAB3
-      AA00DAB3AB00DACAB300DACECE00DBA6A600DBB4AB00DBB4AC00DBB5AC00DBB6
-      AC00DBC1B000DBCBB400DBCCB400DCB6AC00DCB6AD00DCCCB400DDB7AE00DDB8
-      AE00DDCDB600DEADAB00DEBAAF00DEBBB000DED4D400DFBCB100DFBDB100DFBD
-      B200DFBEB200DFD0B900E0ADAC00E0B4AE00E0BDB200E0BEB200E0BFB300E0D2
-      BA00E1ADAD00E1C0B400E1C1B400E1D1BA00E2BAB200E2C3B500E3C4B600E3C5
-      B700E3C7B700E4C5B700E4C7B700E4C7B800E4C8B800E4C9B900E5C9B900E5CA
-      B900E5CABA00E5CBBA00E6CCBC00E6DDDD00E7CEBD00E7D7C000E8B8B500E8B9
-      B600E8BAB600E8C3B900E8CFBD00E8CFBE00E8D0BE00E8D0BF00E8D1BF00E9C7
-      BB00E9D1BF00E9D2BF00E9D2C000E9D3C000EAC7BC00EBD5C200ECB9B800ECCE
-      BF00ECD4C200ECD7C300ECD8C300ECD8C400ECD9C400ECE6E600EDD9C400EDD9
-      C500EDDAC500EDDBC500EED3C300EEDBC700EEDCC700EEDDC800EFCCC100EFDD
-      C800F0BEBC00F0DFC900F0E0CA00F0E1CA00F0E1CB00F1E1CB00F1E2CB00F1E2
-      CC00F1E3CC00F1EDED00F2C4C100F2C9C200F2DDCA00F2E3CC00F2E4CC00F2E4
-      CD00F2E5CD00F2EDEE00F3E5CD00F3E5CE00F3E6CE00F3EFEF00F4F0F000F4F0
-      F100F5E5CF00F5F2F200F6EBD200F6ECD300F6F3F400F7ECD300F7EDD300F7ED
-      D400F7EED400F8EDD400F8EED400F8EED500F8EFD500F8F0D500F8F6F600F9EF
-      D500F9F0D600F9F1D600F9F1D700F9F7F700FAF2D700FAF8F800FAF9F900FBF4
-      D900FBF9F900FBFAFA00FCFBFB00FDFDFD00FEFEFE00FFFFFF00FFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCD3C5C5C7B5B5D7CBCBE4DC
-      DCEFEAEAF7F5F5FDFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      36300000424D3634000000000000360400002800000040000000400000000100
+      1800000000000030000000000000000000000001000000000000FFFFFFFFFFFF
       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@@ -469,7 +403,43 @@ object Form1: TForm1
       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000}

this link 有完整的 DFM 文件,该文件存在问题。

【问题讨论】:

  • 那是什么类型的图像?根据快速观察,似乎某些数据损坏发生在运行时或数据未正确加载。如果你看图片,似乎颜色通道可能已经被打乱了。绿色似乎被蓝色取代,蓝色被红色取代,好像颜色通道会移动一个字节。图像位置偏移也可能是这种数据损坏或数据处理不正确的结果,好像文件头没有正确解析,程序可能将其视为图像数据。
  • 请将图像显示为您在 D7 中加载到 BitBtn 中的原始 .bmp。还从 .dfm(D7 和 XE7)复制 Glyph.Data = { 之后的前三行十六进制值
  • 我认为原始图像是PNG文件(可能转换为BMP),我不能肯定,因为我从以前的开发人员那里继承了该项目,我没有原件导入的图像文件......无论如何,我已经用一些有用的信息更新了这个问题。谢谢。
  • 正如您在下面看到的,我分析了您在上面提供的新信息,但它没有任何意义。我附上了一张图片供您尝试,它对您有什么作用?顺便说一句,你在 UI 中使用 TActions 吗?
  • 使用完整 DFM 文件的链接更新帖子。谢谢。

标签: delphi delphi-xe vcl


【解决方案1】:

NumGlyphs 属性与图像中的实际字形数量似乎不匹配。 我无法解释为什么您在 Delphi 7 中没有问题,但我可以在 XE7 中创建相同的效果,例如一个 64x64 TBitBtn,一个 256 像素宽的图像,有四个字形(每个 64 像素宽),如果我设置 NumGlyphs := 3

在设计时,会显示第一个字形。每个字形的像素(256 div 3)的计算将给出 85 像素的宽度。但这并不重要,因为我们看到的是第一个字形,从第一个像素开始。

在运行时,按钮似乎处于禁用 (Enabled=false) 状态,因此它显示第二个字形,但由于 NumGlyphs 中的值错误,它显示从左 85 开始的像素,因此从左切割 21 个像素并将第三个字形中的 21 个像素渗入视野。


您可以将 .dfm 文件(在 D7 和 XE7 中)中 Glyph.Data 的开头与以下分解进行比较

Glyph.Data = {
  36C00000424D36C0000000000000360000002800000000010000400000000100
  18000000000000C00000C40E0000C40E00000000000000000000F0F0F0F0F0F0
  F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0
  ...

解释为

offs  36C00000    file size = 0x0000C036 = 49206
0000  424D        'BM' signature
0002  36C00000    file size
0006  0000        reserved 2 bytes
0008  0000        reserved 2 bytes
000A  36000000    pixel array offset = 0x36 = 54
000E  28000000    BITMAPINFOHEADER size 0x28 = 40
0012  00010000    bitmap width 0x0100 = 256
0016  40000000    bitmap height 0x0040 = 64
001A  0100        num of color planes = 1
001C  1800        num of bits per pixel = 24
001E  00000000    compression method (0 = none)
0022  00C00000    raw bitmap data size 49152 = 256 x 64 x 3 bytes
0026  C40E0000    horizontal resolution (pix per meter) 3780/m
002A  C40E0000    vertical resolution (pix per meter) 3780/m
002E  00000000    num of colors in color palette or 0 for default 2^n
0032  00000000    num of important colors used, or 0 for every color is important
pixel array follows
0036                                                  F0F0F0F0F0F0
003C  F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0

Delphi 在实际的 .bmp 文件前面添加自己的大小。偏移量来自“BM”签名


添加数据后编辑

解释D7和XE7中相同的三行:

Glyph.Data = {
36050000    File size 1334
424D        'BM'
36050000    file size 1334
0000
0000
36040000    1078 pix arr offset
28000000    40 header size
10000000    16 bmp width
10000000    16 bmp height
0100        1 color planes
0800        8 bits per pix
00000000    no compression
00010000    256 raw bitmap data size
00000000    0 horiz pix per meter
00000000    0 vert ppm
00010000    256 colors in palette
00000000    all colors important
00164900001C ....

与您发布的图片不太相符,该图片在灰色细边框内为 64 x 64,具有 1628 种独特颜色。

但真正让我困惑的是单击 Glyph 属性时的变化。根据列出的差异,前三个替换的 (-) 行与上述三行完全不匹配。分手如下:

{
36340000    13366
424D        'BM'
36380000    14390
0000
0000
36080000    2102 pix arr offset
28000000    40 header size
40000000    64 width
40000000    64 height
0100
1800
00000000
00300000    12288 raw bmp data size
00000000
00000000
00010000    256 colors in palette
00000000
724242007B47 ...}

现在,这与大小 (64 x 64) 匹配,但与颜色数量不匹配。无论如何,其余的都是损坏且无用的数据。去搞清楚。我能想到的唯一解决办法就是更换图片。

由于我的编辑器中已经有您发布的图像,因此我制作了一张 192 x 64 的三重图像(正常、禁用、按下),并在 D7 和 XE7 中进行了测试,对我来说效果很好。

在这里,因为你的原件丢失了,作为一个友好的季节礼物:-)

【讨论】:

  • 这可以解释颜色偏移吗?
  • @Sertac 不,不是这样。 SilverWarior 关于损坏的数据可能是正确的,然后这也可以涵盖图像的变化。我希望 OP 会回答 S 的评论。我将添加我自己的 q。
  • 我已经用其他信息更新了答案...感谢您的帮助。
【解决方案2】:

我决定输入另一个答案而不是编辑前一个答案,因为第一个答案是由当时可用的信息给出的,虽然不是正确的,但可能有目的。以下是我认为正确的答案。

简短回答

大多数图像的标题部分损坏。原因可能是在原始图像中,从其他图像格式转换或在Delphi7中,但我无法留出足够的时间来调试代码。如果我有时间,我会看看 TBitmap.ReadDIB 和 TBitmap.Changed。 Delphi XE7 中的错误表面(可能也在早期版本中),因为在上述方法中进行了一些更改。

解决方法是在像样的图像编辑器中重绘图像

更长的答案

我通过调查 .dfm 文件中几个 TBitBtn 控件的 Glyph.Data 得出了损坏图像的结论。那些似乎是错误的在位图标题中有类似的错误。让我们看看其中之一:

ToolButton1: TBitBtn

    Glyph.Data = {
      36340000424D3638000000000000360800002800000040000000400000000100
      1800000000000030000000000000000000000001000000000000724242007B47
      ...}
Glyph.BitmapSize     = 13366
bmfh.bfType          = BM
bmfh.bfSize          = 14390
bmfh.bfReserved1     = 0
bmfh.bfReserved2     = 0
bmfh.bfOffBits       = 2102
bmih.biSize          = 40
bmih.biWidth         = 64
bmih.biHeight        = 64
bmih.biPlanes        = 1
bmih.biBitCount      = 24
bmih.biCompression   = 0
bmih.biSizeImage     = 12288
bmih.biXPelsPerMeter = 0
bmih.biYPelsPerMeter = 0
bmih.biClrUsed       = 256
bmih.biClrImportant  = 0

整个Glyph.Data的结构是

Glyph.BitmapSize (size  4 bytes), managed by Delphi
BITMAPFILEHEADER (size 14 bytes)
BITMAPINFOHEADER (size 40 bytes)
bmiColors array  (size, when used, should be biClrUsed * SizeOf(TRGBQuad) or 1024 in this case)
bmBits (pixel values, either indexes to bmiColors or direct RGB(A) color values)

问题是:

  1. Glypf.BitmapSize 是 13366,但 bmpfh.bfSize 报告它是 14390,相差 1024 字节。
  2. 据报道像素阵列的偏移量为 2102。减去 bmfh (14) 和 bmih (40) 的大小,为颜色表 bmiColors 留下 2048 个字节。应该是 1024。
  3. .dfm 中的实际图像数据对于颜色表 bmiColors 为 1024 字节。当在 XE7 中读取图像时,错误的 bfOffBits 会偏移像素数据的开头,因此我们会看到图像及其颜色的偏移。
  4. 当通过打开图像编辑器“重新加载”图像时,错误会重复出现,并且已经有错误的数据,并且图像和颜色的变化被夸大了。

如上所述,解决方法是重新绘制图像。当然也可以尝试直接更改 .dfm 文件。

【讨论】:

  • 有没有免费的工具可以快速重绘图片?谢谢。
  • @aleroot 我不知道,但我已经更正了图像。在 Embarcadero 论坛中查找给您的消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
相关资源
最近更新 更多