TImageList-真彩色&x2B;alpha通道与8位(256色)通道 我使用C++ Builder 2009,但我也把它标记为Delphi,因为我也希望在那里也存在同样的问题。
我使用TImageList-真彩色&x2B;alpha通道与8位(256色)通道 我使用C++ Builder 2009,但我也把它标记为Delphi,因为我也希望在那里也存在同样的问题。,delphi,c++builder,vcl,delphi-2009,Delphi,C++builder,Vcl,Delphi 2009,我使用TImageList(16x16)并将其与TListView(SmallImages)和TTreeView相关联 我通过IDE(设计时)添加了新图标,并导入了一些16x16真彩色+alpha通道图标。在IDE中,它们看起来很好: 在运行时,它们看起来一点也不好: 特别注意边缘。顶部图标为图标5,底部图标为图标7。看看上图中他们应该是什么样子 当我将图标转换为8位(256色)图标并通过IDE导入它们时,它们在运行时看起来很好!因此,这对我来说无疑是一个解决方案。但是这些图标显然丢失了信息
TImageList
(16x16)并将其与TListView
(SmallImages)和TTreeView
相关联
我通过IDE(设计时)添加了新图标,并导入了一些16x16真彩色+alpha通道图标。在IDE中,它们看起来很好:
在运行时,它们看起来一点也不好:
特别注意边缘。顶部图标为图标5,底部图标为图标7。看看上图中他们应该是什么样子
当我将图标转换为8位(256色)图标并通过IDE导入它们时,它们在运行时看起来很好!因此,这对我来说无疑是一个解决方案。但是这些图标显然丢失了信息,虽然在16x16图标中几乎看不到,但我还是有点不明白为什么会发生这种情况
ImageList在设计时创建,并具有其默认属性
我还尝试了:DrawingStyle=dsTransparent
和ColorDepth=cd32Bit
,之后我不得不通过IDE再次导入图标。
结果是一样的。我想知道是否需要设置一个特定的BlendColor
我需要做一些特殊的事情来支持真彩色图标吗?
还是TTreeView和TListView存在问题?
这是VCL限制还是Windows或。。
想法、建议
-其他信息-阅读David的评论后
我在我的项目中添加了一个新的TImageList,并添加了带有alpha通道的32位图标。接下来,我“黑”了我的代码,让它总是使用那个ImageList,它工作得很好
我在代码中所做的是,因为我有一组用于所有操作系统的图标(非常与应用程序相关),并且因为我也使用特定于操作系统的图标,如文件夹图标、CD图标等。我有一个包含所有图标(操作系统和应用程序特定)的图像列表,以及程序启动和操作系统检查,我将需要的操作系统图标从一个列表复制到我使用的列表中
像这样:
TIcon *Icon = new TIcon() ;
for (int x = 0 ; x < OS_Specific_count ; x++)
{
OS_xx_ImageList->GetIcon(x, Icon) ;
Use_ImageList->ReplaceIcon(x, Icon) ;
}
delete Icon ;
从一个空的Use_ImageList开始,似乎可以正确保存所有alpha通道数据!
也许我应该重写代码,以便总是以这种方式复制该地块…真彩色?为什么不是32bpp,每个通道8个像素。@DavidHeffernan-这就是IcoFX的名字。但它是一个带有alpha通道的32位图标,它直接来自OS图标库/dll。我在Delphi中非常高兴地使用这些图标。从Delphi 6开始就这样做了。尽管那时我们必须手动创建图像列表句柄。我们看不到的是你在做什么。也许你的代码有缺陷。这就是为什么我们要求一个新的解决方案。如果你做了一个测试,那么我们可以100%确定我们在看与你相同的程序。@DavidHeffernan-你是对的!!!我在底部添加了一个包含新信息的部分。我需要注销,但明天会跟进。@DavidHeffernan-知道为什么在ImageList中获取图标或位图并替换它会“破坏”alpha通道信息吗?真彩色?为什么不是32bpp,每个通道8个像素。@DavidHeffernan-这就是IcoFX的名字。但它是一个带有alpha通道的32位图标,它直接来自OS图标库/dll。我在Delphi中非常高兴地使用这些图标。从Delphi 6开始就这样做了。尽管那时我们必须手动创建图像列表句柄。我们看不到的是你在做什么。也许你的代码有缺陷。这就是为什么我们要求一个新的解决方案。如果你做了一个测试,那么我们可以100%确定我们在看与你相同的程序。@DavidHeffernan-你是对的!!!我在底部添加了一个包含新信息的部分。我需要注销,但明天会跟进。@DavidHeffernan-知道为什么在图像列表中获取图标或位图并替换它会“破坏”alpha通道信息吗?
TBitmap *Bitmap= new TBitmap () ;
for (int x = 0 ; x < OS_Specific_count ; x++)
{
OS_xx_ImageList->GetBitmap(x, Bitmap) ;
Use_ImageList->Replace(x, Bitmap, NULL) ;
}
delete Bitmap;
Use_ImageList->AddImage(OS_xx_ImageList, x) ;