0

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。これを閉じることに投票した人は、理由をコメントしてください。どのような間違いを犯したのか分からない場合、どうすれば改善できますか?

4

1 に答える 1