【问题标题】:Load .png to TImage in Embarcadero C++Builder XE5在 Embarcadero C++Builder XE5 中将 .png 加载到 TImage
【发布时间】:2014-05-04 11:37:48
【问题描述】:

我需要加载 .png 图像,因为我需要它的透明度。例如在 bmp 中转换它不是一个选项,因为我失去了它的透明度。 我该怎么做?

【问题讨论】:

    标签: c++ png timage c++builder-xe5


    【解决方案1】:

    只需为stdimage.hpp 添加一个包含。

    在设计时,这将使 .png 文件在 Image.Picture 对话框中可用。在运行时,您可以使用该文件创建和加载 TPngImage,并将其分配给Image.Picture

    #include <stdimage.hpp>
    
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
      TPngImage* img = new TPngImage();
      img->LoadFromFile("C:\\Images\\calculator.png");
      Image1->Picture->Assign(img);
      delete img;
    }
    

    (包括 Delphi 代码和解释以及 C++ Builder,因为 TImageTPngImage 都是 Delphi 类,因此它是相关的,并且因为 C++ Builder 用户应该非常熟悉将 Delphi 代码翻译为整个 VCL是基于它构建的。另外,由于TImage 是一个 Delphi VCL 组件,Delphi 用户可能会发现问题并找到有用的信息。)

    procedure TForm4.Button1Click(Sender: TObject);
    var
      Png: TPngImage;
    begin
      Png := TPngImage.Create;
      try
        Png.LoadFromFile('C:\Images\calculator.png');
        Image1.Picture.Assign(Png);
      finally
        Png.Free;
      end;
    end;
    

    更多信息在XE5 documentation

    【讨论】:

    • 我的错,我使用的是 XE5。我试试看。
    • 当我尝试这一行时,我得到“预期类型名称”:TPngImage *Image;
    • C++ Builder 有 VCL,因此有 TPngImage。它包含在 XE5 的 VCL.Imaging 包中。
    • @大卫。发帖者熟悉VCL,问题标记为C++ Builder。必要的组件位于 VCL 包中。一如既往地感谢您的意见。
    • 阅读我的回答。它解释了为什么使用 Delphi 代码。 (我没有在这台机器上安装 Builder,也不会发布我无法先编译和测试的 Builder 代码。)一旦我到达一台拥有它的机器,我会很高兴用 Builder 代码更新答案可用。
    【解决方案2】:

    在 C++ Builder 中,代码可能如下所示:

    #include <pngimage.hpp>
    ....
    std::auto_ptr<TPngImage> img(new TPngImage());
    img->LoadFromFile(...);
    Image1->Picture->Assign(img);
    

    【讨论】:

    • 此代码无法在 C++ Builder 中编译。 (在 Builder XE2 中测试。)
    • 是的,从这些开始: E2316 'auto_ptr' 不是 'std' 的成员,E2108 错误使用 typedef 'TPngImage',E2268 调用未定义的函数 'img' E2288 指向所需结构的指针-> 或 ->* 的左侧
    • 显然您需要为auto_ptr 包含memory 标头。这是不言而喻的!
    • Delphi 代码无关紧要。如果发帖者熟悉 Delphi,它可能会很有用。由于它与 VCL (TImage) 相关,因此无论关于 Builder 的问题如何,它都是相关的(并且 Delphi 用户可能会遇到它并发现它很有帮助)。我可以指出您的帖子,该帖子不仅没有回答所提出的问题,而且在我发布了您说“留下以防将来有人发现它有用”的正确答案后被遗弃了。我真的不在乎你是否恢复投票;我注意到了虚伪。
    • 除非我不同意,通过删除它会使答案更好。如果我决定任意告诉您从您写的答案中删除某些内容(并且您认为该信息是相关的),您会删除它吗?我非常怀疑。
    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多