如何添加新的位图格式到TBitmapCodecManager



我已经编写了一个类来读取和写入PPM文件(不要问,我没有选择这种格式)。我希望它成为TBitmap加载/保存系统的一部分。

有谁知道我该如何添加这个支持吗?我真的必须编写/安装一个完整的编解码器吗?

解决方案:

在Remy Lebeau的帖子中,我设法编写并注册了一个编解码器。然而,所有需要的功能都没有文档化,所以需要一些试验/错误才能使其工作。

要注册新的编解码器,您需要像这样使用TBitmapCodecManager的静态成员RegisterBitmapCodecClass

TBitmapCodecManager::RegisterBitmapCodecClass(".ppm","portable pixmap",true,__classid(TMyCodec));

编解码器需要定义这些函数:

class TMyCodec : public TCustomBitmapCodec {
    public:
        bool __fastcall LoadFromStream(System::Classes::TStream* const AStream, Fmx::Surfaces::TBitmapSurface* const Bitmap);
        bool __fastcall LoadFromFile(const System::UnicodeString AFileName, Fmx::Surfaces::TBitmapSurface* const Bitmap);
        bool __fastcall SaveToFile(const System::UnicodeString AFileName, Fmx::Surfaces::TBitmapSurface* const Bitmap, const PBitmapCodecSaveParams SaveParams = (PBitmapCodecSaveParams)(0x0));
        bool __fastcall SaveToStream(System::Classes::TStream* const AStream, Fmx::Surfaces::TBitmapSurface* const Bitmap, const System::UnicodeString Extension, const PBitmapCodecSaveParams SaveParams = (PBitmapCodecSaveParams)(0x0));
        __classmethod System::Types::TPointF __fastcall GetImageSize(const System::UnicodeString AFileName);
        __classmethod bool __fastcall IsValid(System::Classes::TStream* const AStream);
        bool __fastcall LoadThumbnailFromFile(const System::UnicodeString AFileName, const float AFitWidth, const float AFitHeight, const bool UseEmbedded, Fmx::Surfaces::TBitmapSurface* const Bitmap);
};

Fmx::Surfaces::TBitmapSurface没有文档记录,但是IDE为我提供了可用的函数。我认为Pixels[x][y]数组用于读取/写入像素。

类注册后,您可以像往常一样使用TBitmap->LoadFromFile("");

读取新的图像类型。

享受吧!

p。那些投票反对关闭的人,请评论为什么?如果我们不知道自己犯了什么错误,我们如何改进呢?

您需要从TCustomBitmapCodec中派生一个新类,并实现虚拟的LoadFrom...()SaveTo...()方法,然后在应用程序启动时使用TBitmapCodecManager::RegisterBitmapCodecClass()注册该类。

相关内容

  • 没有找到相关文章

最新更新