*如果使用 v6 ImageList 控件,.bmp 会丢失透明背景

2024-03-19

抱歉,我的英语不是很好。

我需要在我的 D7 应用程序中使用半透明位图图片。所以,我应该使用 XPManifest 和 ImageList version6 而不是 5.8 标准版。但在这种情况下,我遇到了一个问题:当我从流中加载图像时,所有图像都会失去透明度!

type
  TForm2 = class(TForm)
    btn4: TButton;
    btn5: TButton;
    lst1: TbtkListView;
    il1: TImageList;
    btn1: TButton;
    tlb1: TToolBar;
    btn2: TToolButton;
    btn3: TToolButton;
    xpmnfst1: TXPManifest;
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    FS: TFileStream;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.btn4Click(Sender: TObject);
var
  Bmp       : TBitmap;
  ImageList: TbtkImageList;
begin
  ImageList := TbtkImageList.Create(nil);
  Bmp       := TBitmap.Create;
  FS        := TFileStream.Create('c:\temp\1.cmp',fmCreate);
  try
    Bmp.LoadFromFile('c:\temp\1.bmp');
    ImageList.Add(Bmp, nil);
    FS.WriteComponent(ImageList);
  finally
    Bmp.Free;
  end;
end;

procedure TForm2.btn5Click(Sender: TObject);
var
  Bmp       : TBitmap;
  ImageList : TbtkImageList;
begin
  ImageList := TbtkImageList.Create(nil);
  Bmp := TBitmap.Create;
  try
    FS.Position := 0;
    FS.ReadComponent(ImageList);
    ImageList.GetBitmap(0, Bmp);
    Bmp.SaveToFile('c:\temp\3.bmp');
  finally
    Bmp.Free;
    ImageList.Free;
  end;
end;

ImageListCreationCode:
constructor TbtkImageList.Create(AOwner: TComponent);
begin
  inherited;

  if HandleAllocated then
    ImageList_Destroy(Handle);
  Handle := ImageList_Create(32, 32, ILC_COLOR32, AllocBy, AllocBy);
end;

http://s020.radikal.ru/i720/1403/36/c2702a8b5c1a.png http://s020.radikal.ru/i720/1403/36/c2702a8b5c1a.png Before http://s001.radikal.ru/i195/1403/e2/1dd5ff14aa51.png http://s001.radikal.ru/i195/1403/e2/1dd5ff14aa51.png After

有人可以帮助我吗?


一旦您将具有 Alpha 通道信息的位图放入图像列表中,就没有简单的 (*) 方法可以将其以其原始位图形式取出。TImageList.GetBitmap只需设置传递给它的位图的尺寸,并且draws在它的画布上。它不使用可以透明绘制的重载,但它并不那么重要,而不是使用GetBitmap你可以打电话给Draw让自己超负荷。

因此,如果您需要保留位图的原始形式,我建议不要对图像列表进行流式输入和输出,而是对位图本身进行流式传输。


尝试下面的方法,看看它是否符合您的需求(它是透明的,但可能与再次绘制的源位图不同):

var
  Bmp       : TBitmap;
  ImageList : TImageList;
  FS: TFileStream;
begin
  ImageList := TImageList.Create(nil);
    try
      FS := TFileStream.Create('c:\temp\1.cmp',fmOpenRead or fmShareDenyWrite);
      try
        FS.ReadComponent(ImageList);
      finally
        FS.Free;
      end;
      Bmp := TBitmap.Create;
      try
        Bmp.PixelFormat := pf32bit;
        Bmp.Canvas.Brush.Color := clNone;
        Bmp.Width := ImageList.Width;
        Bmp.Height := ImageList.Height;
        ImageList.Draw(Bmp.Canvas, 0, 0, 0, dsNormal, itImage);
        Bmp.SaveToFile('c:\temp\3.bmp');
      finally
        Bmp.Free;
      end;
  finally
    ImageList.Free;
  end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

*如果使用 v6 ImageList 控件,.bmp 会丢失透明背景 的相关文章

随机推荐

  • 在 Z3 中证明归纳事实

    我试图在 Microsoft 的 SMT 求解器 Z3 中证明一个归纳事实 我知道 Z3 一般不提供此功能 如Z3 guide http rise4fun com z3 tutorial guide 第 8 节 数据类型 但是当我们限制要证
  • 未捕获的语法错误:意外的标记:

    我正在 MooTools 脚本中运行 AJAX 调用 这在 Firefox 中工作正常 但在 Chrome 中我得到了Uncaught SyntaxError Unexpected token 错误 我无法确定原因 注释掉代码以确定错误代码
  • 传递多个参数来应用 (Python)

    我正在尝试清理 Python 中的一些代码以向量化一组功能 我想知道是否有一种好方法使用 apply 来传递多个参数 考虑以下内容 当前版本 def function 1 x if string in x return 1 else ret
  • Firebase事务api调用当前数据为空

    当我使用transaction 更新一个位置 该位置的数据是返回空值即使该位置有一些数据 I tried transaction 读取数据后在同一位置 它提供该位置的所有数据 我该如何使用transaction 如果情况像上面那样呢 事务以
  • PHP set_time_limit 抛出 500 错误?

    当我使用set time limit如果脚本运行时间超过 360 秒 则会抛出 500 错误 359 没什么 360及以上 错误 我无法访问 php ini 如何修复此错误 脚本运行时间超过 360 秒 就会抛出 500 错误 听起来你在某
  • Kafka消费者启动延迟汇合dotnet

    当启动 confluence dotnet Consumer 时 在调用订阅和后续轮询之后 似乎需要很长时间才能从服务器接收 分区已分配 事件 因此也需要很长时间 大约 10 15 秒 起初我以为存在自动创建主题的开销 但无论消费者的主题
  • 我应该如何设置集成测试以将测试数据库与实体框架结合使用?

    我正在为应用程序编写集成测试 但无法找到有关如何为我的集成套件设置测试数据库的任何最佳实践 我正在使用实体框架代码优先开发 ASP NET MVC4 应用程序 我可以确认我的测试项目中的测试默认与我的计算机上的本地开发数据库进行通信 这并不
  • Fortran 小数和千位分隔符

    有没有办法更改逗号的句点小数分隔符 另外 如何使输出数字具有千位分隔符 这可以是逗号 句号 空格 打开文件时使用参数 DECIMAL COMMA open 100 file logfile status unknown DECIMAL CO
  • 在此上下文中未定义“this”

    我该如何解决以下情况 interface I class A i I class C I A this lt lt this is not defined in this context 简而言之 我想将类实例传递给超类构造函数 在科特林中
  • iOS/iPhone 可达性 - 如何使用 Reachability.m/.h 仅检查互联网丢失/无法可达的情况

    目前我正在使用苹果的reachability m h 的类并且它可以工作 除了它会通知我任何更改 因为我只想在网络无法访问时通知用户 目前 如果我有互联网连接 然后松开网络 它会告诉我 但是 当您重新连接到网络时 它也会告诉我 这是我不想要
  • 如何将LiveData保存到saveStateHandle中?

    如图所示https stackoverflow com a 61166665 3286489 https stackoverflow com a 61166665 3286489 我们可以将LiveData保存在savedStateHand
  • 具有模型属性的 Django 管理 search_fields

    我正在尝试使用模型中的属性作为 django admin 1 2 中的字段 这是我的代码的示例 class Case models Model reference models CharField u Reference max lengt
  • GIT 重命名分支并保留所有提交历史记录

    我有一个关于重命名 git 分支的问题 我创建了一个本地分支dev并将分支推送到远程 我做了很多工作dev分支并定期更新远程分支 现在我想更改分支的名称dev to development 我知道如何重命名 GIT 中的分支 我的问题是 如
  • flex 中 yywrap() 的含义

    该指令在 flex lex 中意味着什么 define yywrap 1 和这个 t 我在下面的代码中找到它 t putchar t 输入 你好世界 输出 你好世界 根据Lex 和 Yacc 页面 http dinosaur compile
  • 如何更改字符串日期的日期格式

    我有像这样的字符串形式的日期 String date 11 12 2018 我想把它改成 2018 12 11 具有相同的变量 因此 我尝试了下面的代码 但它没有给出我期望的输出 String date 11 12 2018 SimpleD
  • 在 C 中,作为参数传递时,“&function”和“function”之间有什么区别?

    例如 include
  • File.Open的默认目录是什么?

    我有这个代码 Stream f File Open data majid FileMode OpenOrCreate FileAccess ReadWrite 文件将在哪里创建 From the File OpenMSDN 文档 http
  • 在哪里可以下载旧版本的 Dart SDK

    我需要获取旧版本的 Dart SDK 来解决问题 具体来说是 Dart SDK 1 5 1 但 dartlang 当前的稳定版本是 1 6 0 是否有一个 URL 可以让我获取所有过去的 Linux 或 MacO 版本的 SDK Updat
  • 这些是 nativecrypto 错误消息吗?

    当我的 Android 手机和服务器之间建立 TLS 连接时 我得到以下信息nativecrypto error messages in logcat 06 30 21 55 06 565 E NativeCrypto 24826 ssl
  • *如果使用 v6 ImageList 控件,.bmp 会丢失透明背景

    抱歉 我的英语不是很好 我需要在我的 D7 应用程序中使用半透明位图图片 所以 我应该使用 XPManifest 和 ImageList version6 而不是 5 8 标准版 但在这种情况下 我遇到了一个问题 当我从流中加载图像时 所有