You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载BMP/PNG/JPG遇PNG错误,求解决及缩放后存PNG方案

加载PNG报错及强制保存为PNG的解决方案

1. PNG加载报错的根源与修复

Graphics::TBitmap默认仅支持BMP格式,要加载PNG必须先注册PNG图像格式,或者改用兼容性更强的TPicture类。

方案1:注册PNG格式(全局生效,推荐)

在程序启动时(比如主窗体构造函数)添加注册代码,后续TBitmap可直接加载PNG:

#include <PNGImage.hpp>
void __fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
    TPngImage::RegisterPngImage();
}

方案2:用TPicture加载(无需全局注册)

如果不想全局注册,改用TPicture加载后转成TBitmap用于后续处理:

std::unique_ptr<TPicture> srcPic(new TPicture());
srcPic->LoadFromFile(ImageModule->OpenPictureDialog1->FileName);
srcBitmap->Assign(srcPic.get());

2. 缩放代码的逻辑错误修正

你当前的StretchDraw参数完全搞反了:应该是**目标画布(dstBitmap的Canvas)**绘制源图像(srcBitmap),而不是用源画布去画目标。正确代码:

dstBitmap->Canvas->StretchDraw(Rect(0, 0, 64, 64), srcBitmap.get());

3. 强制保存为PNG格式

TBitmap::SaveToFile默认输出BMP格式,要强制保存为PNG,必须用TPNGImage类转换后保存:

#include <PNGImage.hpp>
// 缩放完成后转换为PNG并保存
std::unique_ptr<TPNGImage> pngImg(new TPNGImage());
pngImg->Assign(dstBitmap.get());
// 强制替换后缀为.png,避免原格式影响
String savePath = TPath::ChangeExtension(FSettings->LogoFileName[AIndex], L".png");
pngImg->SaveToFile(savePath);
// 更新配置中的路径为PNG路径
FSettings->LogoFileName[AIndex] = savePath;

完整修复代码

#include <PNGImage.hpp>
#include <System.IOUtils.hpp>

void __fastcall TMainForm::LogoImageClick(TObject* Sender)
{
    int AIndex = ControlList1->ItemIndex;

    if (ImageModule->OpenPictureDialog1->Execute()) {
        std::unique_ptr<Graphics::TBitmap> srcBitmap(new Graphics::TBitmap());
        std::unique_ptr<Graphics::TBitmap> dstBitmap(new Graphics::TBitmap());
        String originalFile = ImageModule->OpenPictureDialog1->FileName;
        // 构造带.png后缀的保存路径
        String saveFile = TPath::Combine(ExtractFilePath(FSettings->FileName),
                                        TPath::ChangeExtension(ExtractFileName(originalFile), L".png"));
        FSettings->LogoFileName[AIndex] = saveFile;

        try {
            // 临时注册PNG格式(如果全局没注册的话)
            TPngImage::RegisterPngImage();
            // 加载源图片
            srcBitmap->LoadFromFile(originalFile);
            // 设置目标尺寸
            dstBitmap->SetSize(64, 64);
            // 正确缩放绘制
            dstBitmap->Canvas->StretchDraw(Rect(0, 0, 64, 64), srcBitmap.get());
            // 保存为PNG
            std::unique_ptr<TPNGImage> pngImg(new TPNGImage());
            pngImg->Assign(dstBitmap.get());
            pngImg->SaveToFile(saveFile);

        } catch (const Exception& e) {
            ShowMessage(L"图片处理失败:" + e.Message);
        }
    }
}

注意事项

  • 确保项目包含PNGImage.hpp头文件,C++Builder默认会自动链接PNG库,无需额外配置。
  • 新版本C++Builder(10.4+)的TBitmap已原生支持PNG,但注册代码仍兼容旧版本,可放心使用。

内容的提问来源于stack exchange,提问作者JKofsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:37:10