[25.06.2004 14:22] Обнаружено письмо от Victor V. Vakchturov
[25.06.2004 14:22] Тема "Масштабирование картинки в памяти"
VVV> Здравствуйте !
VVV> Гы ! Типа счас буду писать конструктивную критику :)
>> CDC export_dc(::CreateCompatibleDC(::GetWindowDC(m_hWnd)));
VVV> Мда... А возвращаемые значения принципиально не проверяются
VVV> (типа там, если CreateCompatibleDC или GetWindowDC NULL вернут) ?
Хочется сначала сделать just work, а потом уже work well :)
К тому же хочется минимизировать код, убрать все не имеющее отношение
к проблеме.
>> unsigned char *export_bits = new unsigned char[m_export_width *
>> m_export_height * 4];
VVV> Формула совсем не всегда верна. Надо вычислять так :
VVV> ((m_export_width * cClrBits + 31) & ~31) / 8 * m_export_height, где
VVV> cClrBits - бит на пиксел (в твоем случае - 32)
А чем хуже (m_export_width * m_export_height * 4 + 4), если что
максимум запасных байт, на всякий случай ;).
>> CBitmap oldBitmap = export_dc.SelectBitmap(export_bitmap);
VVV> наверно тут CBitmap *pOldBitmap = ...
VVV> ^ надо ?
Я под WTL пишу, CBitmap используется только как контейнер. Переписал
код на чистый WinAPI, результат такой же. Т.е. проблема не в WTL.
>> export_dc.FillRect(CRect(15,15, 35,35),
>> ::CreateSolidBrush(COLORREF(0x00ff00)));
VVV> Здесь будет происходить утечка ресурсов (дескриптор, возвращаемый
VVV> CreateSolidBrush просто теряется) - надо такие вещи DeleteObject
VVV> делать.
Угу, я это делаю в деструкторе (2м аргументом у меня m_bg_color).
>> //export_dc.SelectBitmap(oldBitmap);
VVV> То же... надо : export_dc.SelectBitmap(*pOldBitmap);
>> BITMAPINFO bitmap_info = {{sizeof(BITMAPINFO), m_export_width,
>> m_export_height,
>> 1, 32, BI_RGB, 0, 0, 0, 0, 0},
>> {255,0,0,0}};
VVV> Гм... А зачем тут RGBQUAD вставлять ? Тут же 32 бит изображение ?
Я уже все перепробывал, кроме того :
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
>> export_bitmap.GetDIBits(export_dc,0, m_export_height, .........
>> // сохраняем export_bits в файл
VVV> Нда... а заголовок кто за Вас сохранит ?
VVV> Про BITMAPFILEHEADER что нибудь читали ?
У меня всегда 32 бит, и сохраняю я все это в jpeg, в правильности
сохранения я уверен. В других местах строчка:
Jpeg::FileExporter(ConvertBSTRToString(filename), m_export_width, \
m_export_height, (unsigned char*)export_bits);
работает нормально.
>> После сохранения в файл получаю черную картинку с правильным
>> квадратиком, но не зеленого цвета, а чб шума.
>> Все что можно перепробывал .. вообще голова отказывается варить :(
VVV> Я же давал ссылку :
VVV> http://softmaker.fatal.ru/sources/vc/graphics/WinToFile.zip (28.3 kb).
VVV> Просто скачай и изучи функции созранения в файл.
У меня она не заработала. Файл создала, но Windows Picture and Fax
Viewer пишет drawing failed, при попытке открыть файл.
Если честно, то я не разобрался до конца в этом коде.
VVV> Если посмотреть в MSDN - там такого куча (есть прямо классы для работы
VVV> с DIB). Поищи по словам "Storing Image". Или поищи "CreateBMPFile",
VVV> "CreateBitmapInfoStruct".
Мне нужно это обязательно сделать на чистом WinAPI, максимум WTL.
на WinAPI HDC export_dc = ::CreateCompatibleDC(::GetWindowDC(NULL));
if(!export_dc) throw Error("cant get compatible dc");
HBITMAP exp_bmp = ::CreateCompatibleBitmap(export_dc, m_export_width, m_export_height);
if(!exp_bmp) throw Error("cant create compatible bitmap");
unsigned char *export_bits = new unsigned char[m_export_width * \
m_export_height * 4 + 4];
BITMAPINFO bitmap_info;
memset(&bitmap_info, 0, sizeof(BITMAPINFO));
// обрежем как нада
bitmap_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmap_info.bmiHeader.biWidth = m_export_width;
bitmap_info.bmiHeader.biHeight = m_export_height;
bitmap_info.bmiHeader.biPlanes = 1;
bitmap_info.bmiHeader.biBitCount = 32;
bitmap_info.bmiHeader.biCompression = BI_RGB;
HBITMAP oldBitmap = (HBITMAP)::SelectObject(export_dc, exp_bmp);
// m_bg_color == 0x00ff00
::FillRect(export_dc, CRect(15,15, 60,60), m_bg_color);
int scan_lines = ::GetDIBits(export_dc, exp_bmp, 0, \
m_export_height, export_bits, &bitmap_info, DIB_RGB_COLORS);
if(!scan_lines)
throw Error("cant get any scanline from export dc");
::BitBlt(::GetWindowDC(NULL), 0, 0, m_export_width,\
m_export_height, export_dc, 0, 0, SRCCOPY);
::SelectObject(export_dc, oldBitmap);
delete[] export_bits;
конец Код рисует в углу окно черный квадрат с квадратиком залитым
двухцветной заливкой, с приближенной яркостью сделаной смешиванием
черных и белых пикселей. Ну должно же быть нормально :(
С пожеланием доброго времени суток,
Олень Элмо
JabberID: da.el***@j*****.ru
Номер выпуска : 3321
Возраст листа : 278 (дней)
Количество подписчиков : 432
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/178612
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписать : mailto:comp.soft.prog.prog--unsub@subscribe.ru
http://subscribe.ru/ mailto:ask@subscribe.ru