Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.67.26] |
|
Сообщ.
#1
,
|
|
|
Есть всякие экзотические форматы графики, которые распаковываются в простой битмап RGB888 или RGBA8888. Заголовков нет, только известны размеры ширины и высоты.
Выводил это через CreateCompatibleBitmap - SetDIBits - StretchBlt… Успешно, но хочу освоить GDI+. Изучил тему про [C++] Работа с растровыми изображениями, Эффекты, трансформация, приделал GDI+… Но есть вопросы: 1. как бы в это GDI+ вставить простой растр? Имеется например RGB-дамп (заполнение сверху вниз) в такой вот памяти: HLOCAL hMemoryRAW = LocalAlloc(LPTR, sizeMemoryRAW); и его размеры UINT RAW_height = 480; UINT RAW_widht = 640; Примерно так он выводился на экране: hBitmap = CreateCompatibleBitmap(hDC, RAW_width, RAW_height); SetDIBits(hDC, hBitmap, 0, RAW_height, hMemoryRAW, (BITMAPINFO*)&bih, DIB_RGB_COLORS); SelectObject(hCompatibleDC, hBitmap); StretchBlt(hDC, 0, 0, Rect.right, Rect.bottom, hCompatibleDC, 0, 0, RAW_width, RAW_height, SRCCOPY); В случае GDI+ - очевидно вместо этого: pImage = new Image(lpFileName); надо что-то другое… Как в это pImage создать картинку не из файла, а из простого растра в вышеупомянутом (HLOCAL)hMemoryRAW и размеров RAW_height/RAW_widht ? 2. А как в pImage = new Image() читать файл не из диска, а тоже из (HLOCAL)-памяти? В MSDN упоминается что оно умеет читать не только файлы но и потоки… Однако внятного примере как этот поток приделать - я не нашёл… |
Сообщ.
#2
,
|
|
|
Цитата f2065 @ Как в это pImage создать картинку не из файла, а из простого растра в вышеупомянутом (HLOCAL)hMemoryRAW и размеров RAW_height/RAW_widht ? Например, так. Цитата f2065 @ 2. А как в pImage = new Image() читать файл не из диска, а тоже из (HLOCAL)-памяти? Ответ аналогичен ответу выше. Для удобства, можно использовать IStream и ::FromStream соответственно. |
Сообщ.
#3
,
|
|
|
Кстати в примере работы GDI+ - у меня почему-то в Win 8.1 не работает сохранение в PNG.
Даже в оригинальном GraphicsDemo.exe при сохранении примера Ladybug.png получается нулевой файл. Проверил в чистой виртуалке с Win10 - тоже файлы не сохраняются. BMP (через GDI+) сохраняется нормально… В примере ошибка в инициализации компрессора для PNG… Посмотрел pImage->GetLastStatus() - ошибка 2 (InvalidParameter)… Убрал для PNG pEncParams: pImage->Save(text_filename, &EncClsid, 0); и сохранение заработало. Очевидно pEncParams->Count = 0; не равнозначно отсутствия структуры параметров (которая не нужна для PNG). Или решать эту проблему с PNG надо как-то по другому? |
Сообщ.
#4
,
|
|
|
Цитата f2065 @ Очевидно pEncParams->Count = 0; не равнозначно отсутствия структуры параметров Да, нужно указывать Null, а раньше на XP этот параметр, когда был не нужен, просто игнорировался. |
Сообщ.
#5
,
|
|
|
Ещё вопрос возник. Предположим, есть pImage = new Image("file.png");
На каком-то этапе мне надо её в виде битмапа попиксельно считать. Примеров полно, но они все начинаются с того что pBitmap = new Bitmap("file.bmp"); Пишут что из Image наследуется и Bitmap, но что-то у меня никак не получается его найти там. Попробовал так: Image *pImage = new Image("file.png"); Rect rect; rect.X = 0; rect.Y = 0; rect.Width = pImage->GetWidth(); rect.Height = pImage->GetHeight(); Graphics *pGraphics = new Graphics(pImage); Bitmap *pBitmap = new Bitmap(rect.Width, rect.Height, pGraphics); Gdiplus::BitmapData *bitmapData = new Gdiplus::BitmapData; pBitmap->LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, bitmapData); Ожидаемого эффекта не даёт почему-то. Т.е. оно создаёт чистую картинку (X/Y правильные, bitmapData->Height тоже) - в bitmapData->Scan0 одни нули, а не то что лежит в pImage… Каким образом из моего pImage сделать pBitmap ? |
Сообщ.
#6
,
|
|
|
Цитата f2065 @ Каким образом из моего pImage сделать pBitmap ? А почему бы сразу не делать битмап: Bitmap Bmp = (Bitmap)Bitmap.FromFile(FileName); Это шарп, плюсов под рукой нет. |
Сообщ.
#7
,
|
|
|
Цитата Mikle @ А почему бы сразу не делать битмап: Потому что это не единственный источник изображения, их много разных, некоторые сразу в Image. Да, если сразу сделать Bitmap из файла - то с ним проблем нет, он нормально попиксельно читается после LockBits. Но мне всё-же надо выковырять Bitmap из Image… Должен же быть какой-то способ (особенно если там заведомо растровый файл)? |
Сообщ.
#8
,
|
|
|
*pBitmap = (Bitmap)*pImage; Как-то так тоже не работает? |
Сообщ.
#9
,
|
|
|
Цитата Mikle @ Угу, «Не существует подходящего определяемого пользователем преобразования из "Gdiplus::Image" в "Gdiplus::Bitmap"»Как-то так тоже не работает? Кроме как сохранять Image во временный файл и потом его читать в Bitmap - ничего не могу придумать. Но это как-то слишком некрасиво получается, должен же быть какой-то путь преобразования из Image в Bitmap напрямую в памяти. |
Сообщ.
#10
,
|
|
|
Цитата f2065 @ Каким образом из моего pImage сделать pBitmap ? Save в IStream и FromStream? |