【问题标题】:Is there an FMX function to set a TImage's transparent color at runtime?是否有 FMX 函数可以在运行时设置 TImage 的透明颜色?
【发布时间】:2014-05-21 19:44:22
【问题描述】:

我在 FMX (FireMonkey) 的表单上有一个 TImage。我想在运行时将位图加载到 TImage 中,其中位图应该具有由位图中第一个像素的颜色定义的透明背景。此颜色可能因位图而异。

我知道如何在设计时通过对 TImage 使用 MultiResBitmap 编辑器来执行此操作。但是,我找不到任何关于如何在运行时执行此操作的示例。我是否必须手动执行此操作(获取位图中第一个像素的颜色,然后遍历所有像素并将匹配的任何像素设置为透明),还是有更简单的方法来执行此操作?

【问题讨论】:

  • 您的位图使用什么像素格式?
  • 您是指加载后的 TPixelFormat 值吗?对于我刚刚加载的测试位图,TImage的位图的PixelFormat值为pfA8R8G8B8。
  • 图像具有 Alpha 通道。为什么要担心透明色?
  • 在设计时,您可以在 MultiResBitmap 编辑器中设置“透明颜色”。例如,到 Fuschia。但是,如果我加载具有不同背景颜色的位图(例如,相当于白色),则背景不再显示为透明。我要问的是是否有一个简单的 FMX 函数调用来设置图像以将新的背景颜色显示为透明?
  • 如果图片有alpha通道,那么就没有背景或透明色

标签: delphi c++builder firemonkey


【解决方案1】:

此函数将使用第一个像素的颜色将位图中的某种颜色设置为透明,即 claNull。

void SetTransparent (Graphics::TBitmap *oBmp)
{
  TBitmapData bmpData;
  oBmp->Map (TMapAccess::maReadWrite, bmpData);

  TAlphaColor colorToMakeTransparent = bmpData.GetPixel (0, 0);
  TAlphaColor transparentColor = claNull;

  for (int x=0; x<bmpData.Width; x++)
  {
    for (int y=0; y<bmpData.Height; y++)
    {
      TAlphaColor color = bmpData.GetPixel (x, y);
      if (color == colorToMakeTransparent)
        bmpData.SetPixel (x, y, transparentColor);
    }
  }

  oBmp->Unmap (bmpData);
}
//---------------------------------------------------------------------------

【讨论】:

  • 完美!可以通过替换白色将我必须的图块设置为透明。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多