我已经编写了一个类来读取和写入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()注册该类。