PPM ファイルを読み書きするためのクラスを作成しました (質問しないでください。この形式を選択したわけではありません)。TBitmap
ローディング/セーブシステムの一部にしたいです。
このサポートを追加する方法を知っている人はいますか? 本当に完全なコーデックを作成/インストールする必要がありますか?
解決:
Remy Lebeau の投稿により、コーデックを作成して登録することができました。ただし、必要なすべての機能が文書化されていないため、機能させるには試行錯誤が必要でした。
新しいコーデックを登録するには、このような静的メンバーを使用する必要がありRegisterBitmapCodecClass
ますTBitmapCodecManager
。
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("");
楽しみ!
PS。これを閉じることに投票した人は、理由をコメントしてください。どのような間違いを犯したのか分からない場合、どうすれば改善できますか?