2014-05-31 17 views
0

Я написал класс для чтения и записи PPM-файлов (не спрашивайте, я не выбрал этот формат). Я хотел бы, чтобы это было частью системы загрузки/сохранения TBitmap.Как добавить новый формат растрового изображения в TBitmapCodecManager

Кто-нибудь знает, как я могу добавить эту поддержку? Должен ли я действительно писать/устанавливать полный кодек?

РЕШЕНИЕ:

С Remy Лебо пост мне удалось написать и зарегистрировать кодек. Однако все необходимые функции не документированы, поэтому для его работы потребовалась пробная версия/ошибка.

Чтобы зарегистрировать новый кодек, вам необходимо использовать статический элемент RegisterBitmapCodecClassTBitmapCodecManager вот так.

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. Те, кто голосовал, чтобы закрыть это, пожалуйста, добавьте комментарий к чему? Как мы можем улучшить, если не знаем, какие ошибки мы делаем?

ответ

1

Вам необходимо получить новый класс из TCustomBitmapCodec и реализовать виртуальные LoadFrom...() и SaveTo...() методы, а затем зарегистрировать класс при запуске приложения с помощью TBitmapCodecManager::RegisterBitmapCodecClass().

+0

Спасибо, именно информация, в которой я нуждался :) –