Нужно создать в памяти Gdiplus::Bitmap(), с заданным кол-вом страниц.
Конструкторы Bitmap позволяют создавать только одностраничные Bitmap.
Очевидно, это можно как-то сделать, ведь создает же сам GDI+
многостраничные Bitmap из файлов GIF/TIFF.
Может кто знает внутренний формат Gdiplus::GpImage ? Было бы прекрасно...
Буду очень признателен за советы.
А разве бывают многостраничные битмапы? Вроде как, многостраничность — это свойство формата файла, а не битмапа. Следовательно, нужно просто сохранить все страницы в памяти в виде, например, многостраничного TIFF'а, а затем открыть его, примерно вот так:
CreateStreamOnHGlobal
Image::Save
Image::SaveAdd
Image::SaveAdd
...
Image::FromStream
Здравствуйте, romson, Вы писали:
R>А разве бывают многостраничные битмапы? Вроде как, многостраничность — это свойство формата файла, а не битмапа. Следовательно, нужно просто сохранить все страницы в памяти в виде, например, многостраничного TIFF'а, а затем открыть его, примерно вот так:
R>R>CreateStreamOnHGlobal
R>Image::Save
R>Image::SaveAdd
R>Image::SaveAdd
R>...
R>Image::FromStream
R>
Бывают многостраничные Gdiplus::Bitmap. То есть он может содержать в себе несколько разных страниц (и разрешений тоже).
типа вот этого
Bitmap fourFrames(L"FourFrames.tif");
fourFrames.GetFrameCount(...) == 4
Моя прога хукает основные вызовы gdiplus.dll, подменяя собой загрузку форматов файлов. То есть расширяет его возможности за счет кол-ва загружаемых форматов.
Если я буду перезаписывать картинку в памяти в TIFF, это будет J.O.P.A.
Повторюсь еще раз:
я делаю Bitmap вот етим конструктором
Bitmap(INT width,INT height,INT stride,PixelFormat format,BYTE *scan0);
естественно, он получается одностраничным. Необходимо как-то добавить к нему еще страницы
Здравствуйте, AlexAlex2, Вы писали:
AA>я делаю Bitmap вот етим конструктором
AA>Bitmap(INT width,INT height,INT stride,PixelFormat format,BYTE *scan0);
AA>естественно, он получается одностраничным. Необходимо как-то добавить к нему еще страницы
Что-то мне подсказывает, что без записи в файл у Вас ничего не получится. Потому как, скорее всего, все страницы не хранятся в памяти одновременно, и при каждом вызове Image::SelectActiveFrame нужная страница просто загружается из файла и распаковывается в один и тот же битмап. Ведь не зря же в MSDN написано:
When you call the Image::SelectActiveFrame method, all changes that you made to the previously active frame are discarded. If you want to retain changes that you make to a frame, call the Save method before you switch to a different frame.
Здравствуйте, romson, Вы писали:
R>Здравствуйте, AlexAlex2, Вы писали:
AA>>я делаю Bitmap вот етим конструктором
AA>>Bitmap(INT width,INT height,INT stride,PixelFormat format,BYTE *scan0);
AA>>естественно, он получается одностраничным. Необходимо как-то добавить к нему еще страницы
R>Что-то мне подсказывает, что без записи в файл у Вас ничего не получится. Потому как, скорее всего, все страницы не хранятся в памяти одновременно, и при каждом вызове Image::SelectActiveFrame нужная страница просто загружается из файла и распаковывается в один и тот же битмап. Ведь не зря же в MSDN написано:
R>When you call the Image::SelectActiveFrame method, all changes that you made to the previously active frame are discarded. If you want to retain changes that you make to a frame, call the Save method before you switch to a different frame.
Да, romson, пожалуй так оно и есть. Некоторые совершенно очевидные мысли иногда не приходят в голову, если
постоянно пользуешся другими средствами, чем GDI+
спасибо