Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Привет!

Мне необходимо вырезать кусочек из картинки изменив размер.

..................... код.

// загружаем картинку в контексе
HDC hdcMem = ::CreateCompatibleDC(hdc);
HBITMAP hBitmap = ::CreateCompatibleBitmap(di.hdcDraw, m_jpeg_width, m_jpeg_height);
HBITMAP oldBitmap = (HBITMAP)::SelectObject(hdcMem, hBitmap);

::SetBitmapBits(hBitmap, m_jpeg_width * m_jpeg_height*4, m_bitmap_bits);

// масштабируем
::StretchBlt(di.hdcDraw, rc.0, 0, m_jpeg_width * m_export_resize, m_jpeg_height
* m_export_resize,
hdcMem, 0, 0, m_jpeg_width, m_jpeg_height, SRCCOPY);

// как вытащить картинку из контекста???

::SelectObject(hdcMem, oldBitmap);
::DeleteObject(hBitmap);
::DeleteDC(hdcMem);

.................... конец кода.

Помогите, плиз.

С пожеланием доброго времени суток,
Олень Элмо

JabberID: da.el***@j*****.ru

Номер выпуска : 3311
Возраст листа : 275 (дней)
Количество подписчиков : 430
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/176254
Получить правила : 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

Ответить   Elmo Wed, 23 Jun 2004 14:05:58 -0700 (#176254)

 

Ответы:

Не понятен вопрос. Что ты хочеш получить? Картинку которую сохранить в файл?
Ты же уже скопировал в другой контекст устройтва поменяв изменив размер
рисунка? Что ещё надо?

Привет!

Мне необходимо вырезать кусочек из картинки изменив размер.

..................... код.

// загружаем картинку в контексе
HDC hdcMem = ::CreateCompatibleDC(hdc);
HBITMAP hBitmap = ::CreateCompatibleBitmap(di.hdcDraw, m_jpeg_width,
m_jpeg_height);
HBITMAP oldBitmap = (HBITMAP)::SelectObject(hdcMem, hBitmap);

::SetBitmapBits(hBitmap, m_jpeg_width * m_jpeg_height*4, m_bitmap_bits);

// масштабируем
::StretchBlt(di.hdcDraw, rc.0, 0, m_jpeg_width * m_export_resize,
m_jpeg_height
* m_export_resize,
hdcMem, 0, 0, m_jpeg_width, m_jpeg_height, SRCCOPY);

// как вытащить картинку из контекста???

::SelectObject(hdcMem, oldBitmap);
::DeleteObject(hBitmap);
::DeleteDC(hdcMem);

.................... конец кода.

Помогите, плиз.

С пожеланием доброго времени суток,
Олень Элмо

JabberID: da.el***@j*****.ru

Номер выпуска : 3311
Возраст листа : 275 (дней)
Количество подписчиков : 430
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/176254
Получить правила : 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

http://subscribe.ru/ mailto:ask@subscribe.ru

Номер выпуска : 3312
Возраст листа : 275 (дней)
Количество подписчиков : 430
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/176347
Получить правила : 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

Ответить   Wed, 23 Jun 2004 12:34:23 +0300 (#176347)

 

[23.06.2004 21:34] Обнаружено письмо от Александр Токарев
[23.06.2004 21:34] Тема "Масштабирование картинки в памяти"

А теперь его нужно сохранить в файл. Для этого нужно получить битовый
массив. Тут то я и туплю, как?

С пожеланием доброго времени суток,
Олень Элмо

JabberID: da.el***@j*****.ru

Номер выпуска : 3313
Возраст листа : 275 (дней)
Количество подписчиков : 430
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/176584
Получить правила : 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

Ответить   Elmo Wed, 23 Jun 2004 21:34:40 -0700 (#176584)

 

Здравствуйте !

Вот пример :

http://softmaker.fatal.ru/sources/vc/graphics/WinToFile.zip (28.3 kb).

Это я как то экспериментировал - изображение окошка в файл
записывать. Сейчас поправил - прога просто скриншоты делает
(кладет в файл изображение всего десктопа).
Там в файле WinToFileDlg.cpp есть функции DDBToDIB и WriteDIB -
то, что тебе надо.

--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru

Номер выпуска : 3314
Возраст листа : 276 (дней)
Количество подписчиков : 430
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/176916
Получить правила : 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

Ответить   Thu, 24 Jun 2004 05:16:04 +0400 (#176916)

 

файл?

Раз твоя цель - не вывод картинки, а просто масштабирование в памяти средствами
API, в первом параметре StretchBlt тоже должен быть контекст в
памяти, в который выбран bitmap с новым размером.
Получить результат отрисовки можно с помощью GetDIBits. Кстати, для
установки изображения лучше использовать SetDIBits.
Нужно только не забыть при выделении памяти о выравнивании
строк изображения и о том, что bitmap не
должен быть выбран в контекст.

Номер выпуска : 3316
Возраст листа : 276 (дней)
Количество подписчиков : 431
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/177008
Получить правила : 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

Ответить   Thu, 24 Jun 2004 09:45:11 +0400 (#177008)

 

[24.06.2004 17:26] Обнаружено письмо от Elmo
[24.06.2004 17:26] Тема "Масштабирование картинки в памяти"

Блин вообще ничего не понимаю...

CDC export_dc(::CreateCompatibleDC(::GetWindowDC(m_hWnd)));
CBitmap export_bitmap(::CreateCompatibleBitmap(export_dc, m_export_width, m_export_height));
unsigned char *export_bits = new unsigned char[m_export_width * m_export_height
* 4];

CBitmap oldBitmap = export_dc.SelectBitmap(export_bitmap);

export_dc.FillRect(CRect(15,15, 35,35), ::CreateSolidBrush(COLORREF(0x00ff00)));

//export_dc.SelectBitmap(oldBitmap);

BITMAPINFO bitmap_info = {{sizeof(BITMAPINFO), m_export_width, m_export_height,
1, 32, BI_RGB, 0, 0, 0, 0, 0},
{255,0,0,0}};
export_bitmap.GetDIBits(export_dc,0, m_export_height, export_bits, &bitmap_info,
DIB_RGB_COLORS);

// сохраняем export_bits в файл

delete[] export_bits;

После сохранения в файл получаю черную картинку с правильным
квадратиком, но не зеленого цвета, а чб шума.

Все что можно перепробывал .. вообще голова отказывается варить :(

ЗЫ: пошел за сигаретами, с обеда не курю :(((

С пожеланием доброго времени суток,
Олень Элмо

JabberID: da.el***@j*****.ru

Номер выпуска : 3318
Возраст листа : 277 (дней)
Количество подписчиков : 432
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/178098
Получить правила : 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

Ответить   Elmo Thu, 24 Jun 2004 17:45:22 -0700 (#178098)

 

[24.06.2004 17:26] Обнаружено письмо от Elmo
[24.06.2004 17:26] Тема "Масштабирование картинки в памяти"

Блин вообще ничего не понимаю...

CDC export_dc(::CreateCompatibleDC(::GetWindowDC(m_hWnd)));
CBitmap export_bitmap(::CreateCompatibleBitmap(export_dc, m_export_width, m_export_height));
unsigned char *export_bits = new unsigned char[m_export_width * m_export_height
* 4];

CBitmap oldBitmap = export_dc.SelectBitmap(export_bitmap);

export_dc.FillRect(CRect(15,15, 35,35), ::CreateSolidBrush(COLORREF(0x00ff00)));

//export_dc.SelectBitmap(oldBitmap);

BITMAPINFO bitmap_info = {{sizeof(BITMAPINFO), m_export_width, m_export_height,
1, 32, BI_RGB, 0, 0, 0, 0, 0},
{255,0,0,0}};
export_bitmap.GetDIBits(export_dc,0, m_export_height, export_bits, &bitmap_info,
DIB_RGB_COLORS);

// сохраняем export_bits в файл

delete[] export_bits;

После сохранения в файл получаю черную картинку с правильным
квадратиком, но не зеленого цвета, а чб шума.

Все что можно перепробывал .. вообще голова отказывается варить :(

ЗЫ: пошел за сигаретами, с обеда не курю :(((

С пожеланием доброго времени суток,
Олень Элмо

JabberID: da.el***@j*****.ru

Номер выпуска : 3319
Возраст листа : 277 (дней)
Количество подписчиков : 432
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/178130
Получить правила : 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

Ответить   Elmo Thu, 24 Jun 2004 17:45:22 -0700 (#178130)

 

Здравствуйте !

Гы ! Типа счас буду писать конструктивную критику :)

Мда... А возвращаемые значения принципиально не проверяются
(типа там, если CreateCompatibleDC или GetWindowDC NULL вернут) ?

Формула совсем не всегда верна. Надо вычислять так :
((m_export_width * cClrBits + 31) & ~31) / 8 * m_export_height, где
cClrBits - бит на пиксел (в твоем случае - 32)

наверно тут CBitmap *pOldBitmap = ...
^ надо ?

Здесь будет происходить утечка ресурсов (дескриптор, возвращаемый
CreateSolidBrush просто теряется) - надо такие вещи DeleteObject
делать.

То же... надо : export_dc.SelectBitmap(*pOldBitmap);

Гм... А зачем тут RGBQUAD вставлять ? Тут же 32 бит изображение ?

Нда... а заголовок кто за Вас сохранит ?
Про BITMAPFILEHEADER что нибудь читали ?

Странно, что вообще что то получилось ;-)

Я же давал ссылку :
http://softmaker.fatal.ru/sources/vc/graphics/WinToFile.zip (28.3 kb).
Просто скачай и изучи функции созранения в файл.

Если посмотреть в MSDN - там такого куча (есть прямо классы для работы
с DIB). Поищи по словам "Storing Image". Или поищи "CreateBMPFile",
"CreateBitmapInfoStruct".

--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru

Номер выпуска : 3320
Возраст листа : 277 (дней)
Количество подписчиков : 432
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/178486
Получить правила : 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

Ответить   Fri, 25 Jun 2004 22:25:57 +0400 (#178486)

 

[25.06.2004 14:22] Обнаружено письмо от Victor V. Vakchturov
[25.06.2004 14:22] Тема "Масштабирование картинки в памяти"

Хочется сначала сделать just work, а потом уже work well :)
К тому же хочется минимизировать код, убрать все не имеющее отношение
к проблеме.

А чем хуже (m_export_width * m_export_height * 4 + 4), если что
максимум запасных байт, на всякий случай ;).

Я под WTL пишу, CBitmap используется только как контейнер. Переписал
код на чистый WinAPI, результат такой же. Т.е. проблема не в WTL.

Угу, я это делаю в деструкторе (2м аргументом у меня m_bg_color).

Я уже все перепробывал, кроме того :

typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;

У меня всегда 32 бит, и сохраняю я все это в jpeg, в правильности
сохранения я уверен. В других местах строчка:

Jpeg::FileExporter(ConvertBSTRToString(filename), m_export_width, \
m_export_height, (unsigned char*)export_bits);

работает нормально.

У меня она не заработала. Файл создала, но Windows Picture and Fax
Viewer пишет drawing failed, при попытке открыть файл.

Если честно, то я не разобрался до конца в этом коде.

Мне нужно это обязательно сделать на чистом 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

Ответить   Elmo Fri, 25 Jun 2004 15:55:39 -0700 (#178612)

 

[26.06.2004 1:41] Обнаружено письмо от Elmo
[26.06.2004 1:41] Тема "Масштабирование картинки в памяти"

Ну вот, разобрался! :)

Проблема была тут:

^^^^^^^^^^^^^^^^^^^

^^^^^^^^^

Я создавал совместимые хэндлы из совместимых хэндлов. Из за этого у
меня, почему то, было 4 бита на цвет. Я нарисовал 4 прямоугольника
разными цветами, и получил 4 прямоугольника с двухцветной заливкой.
Цвета определялись интенсивностью плотности точек. После того, как
я создал контексты и битмапки в методе onDraw(), используя контекст
из списка аргументов, все заработало.

Для получения битового массива юзаю GetDIBits.

Спасибо за подсказки :)

С пожеланием доброго времени суток,
Олень Элмо

JabberID: da.el***@j*****.ru

Номер выпуска : 3326
Возраст листа : 279 (дней)
Количество подписчиков : 431
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/179201
Получить правила : 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

Ответить   Elmo Sat, 26 Jun 2004 01:50:51 -0700 (#179201)

 

Hello Elmo,

Saturday, June 26, 2004, 3:55:39 AM, you wrote:

Насчет черного квадрата, все просто и понятно :))
Если ты создаешь CompatibleBitmap и передаешь первый параметр
CompatibleDC, то че бы ты не делал картинка будет 1 битная и зеленый
будет казаться черным :))
Соответсвенно нужно исправить 1 строчку кода, но лучше 2 :)

HDC export_dc = ::CreateCompatibleDC(hDC);

HBITMAP exp_bmp = ::CreateCompatibleBitmap(hDC,
m_export_width, m_export_height);

Ну и дальше как было, и если все остальное нормально то должно
заработать.

Ответить   Sat, 26 Jun 2004 19:03:59 +0500 (#180359)