Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод картинки на экран, Картинка в виде массива байт 
:(
    Опции темы
kvv999
Дата 19.8.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.11.2008

Репутация: нет
Всего: нет



Изображение содержится в массиве байт.
Глубина цвета 8 бит. Градации серого.
Код

//BYTE *data - собственно, массив
// так же известны, ширина, высота и глубина цвета
CPaintDC dc(this);
HBITMAP pic = CreateCompatibleBitmap(dc.m_hDC, width, height);
SetBitmapBits(pic, width*height*depth, data);
dc.DrawState(CPoint(10, 10), CSize(width, height), pic, DST_BITMAP);

Сама по себе картинка отображается корректно, но не верно по масштабу. Получается в несколько раз меньше чем битмап.
Не пойму в чем дело?...

Так же пробовал GDI+
Код

Gdiplus::Graphics g(dc.m_hDC);
g.SetPageUnit(Gdiplus::UnitPixel);
Gdiplus::Bitmap bm(width, height,
                width*depth, // stride ??
                PixelFormat8bppIndexed, data);
g.DrawImage(&bm, Gdiplus::Point(10, 10));

Корректно работает только в случае, если (width % 4 == 0). Если же ширина картинки не кратна 4, ничего толкового не выходит.
Как правильно отобразить картинку любой ширины?
Палитру тут тоже видимо надо свою делать? PixelFormat8bppIndexed - по цветам не годиться конечно, только по размеру. Может есть другой вариант?

ЗЫ
Благодарен за помощь =)
PM MAIL   Вверх
Earnest
Дата 19.8.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Нужно соблюдать выравнивание. Строки в битмапе должны быть выровнены, насколько я помню, на 2 байта, а в DIB Section - на 4 байта. Переформируй массив построчно.
И не понятно, почему ты создаешь совместимый битмап, тогда как у тебя явно сказано - 8 битный. Совместимый - это значит такой же цветности как исходный. Кроме того, размер растра, передаваемый в SetBitmapBits должна быть в байтах, т.е. width*height (width с учетом выравнивания).


--------------------
...
PM   Вверх
kvv999
Дата 19.8.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.11.2008

Репутация: нет
Всего: нет



да... с CreateCompatibleBitmap напартачил...

Таким образом, верный вариант будет таким:
Код

CBitmap bm;
bm.CreateBitmap(width, height, 1, depth, data);
dc.DrawState(CPoint(10, 10), CSize(width, height), bm, DST_BITMAP);

...и все дело в выравнивании массива...
Пошел ровнять... )))

Это сообщение отредактировал(а) kvv999 - 27.8.2009, 14:15
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1829 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.