Я написал класс для чтения и записи PPM-файлов (не спрашивайте, я не выбрал этот формат). Я хотел бы, чтобы это было частью системы загрузки/сохранения TBitmap
.Как добавить новый формат растрового изображения в TBitmapCodecManager
Кто-нибудь знает, как я могу добавить эту поддержку? Должен ли я действительно писать/устанавливать полный кодек?
РЕШЕНИЕ:
С Remy Лебо пост мне удалось написать и зарегистрировать кодек. Однако все необходимые функции не документированы, поэтому для его работы потребовалась пробная версия/ошибка.
Чтобы зарегистрировать новый кодек, вам необходимо использовать статический элемент 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. Те, кто голосовал, чтобы закрыть это, пожалуйста, добавьте комментарий к чему? Как мы можем улучшить, если не знаем, какие ошибки мы делаем?
Спасибо, именно информация, в которой я нуждался :) –