Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Загружаю BMP Изображение получается перевернутым(((  (Прочитано 9269 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 06-10-2004 04:23 » 

Появилась необходимость написать функцию загрузки БМП в ручную(зачем это надо щтдельный разговор) Картинка загружается нормадьно только почемуто перевернутая((( Что я сделал нетак?

HBITMAP CBMPEngine::LoadBMPFile(CString fname)
//
//Функция загружает BMP файл
//
{
//Открываем файл для чтения
HANDLE hFile = CreateFile(   fname,
                     GENERIC_READ,
                     0,
                     NULL,
                     OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL,
                     NULL);  
//Считываем заголовок файла
DWORD dwBytesRead;
BITMAPFILEHEADER hdr;// bitmap file-header
ReadFile(hFile,&hdr,sizeof(BITMAPFILEHEADER),&dwBytesRead, NULL);
UINT ImageSize=hdr.bfSize-hdr.bfOffBits;//Получаем размер изображения
//Считываем заголовок BITMAPINFO
PBITMAPINFOHEADER pbih;
pbih=(PBITMAPINFOHEADER)new char[hdr.bfSize-sizeof(BITMAPFILEHEADER)-ImageSize];
ReadFile(hFile,pbih,hdr.bfSize-sizeof(BITMAPFILEHEADER)-ImageSize,&dwBytesRead, NULL);
//Считываем сам рисунок
BYTE* lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, ImageSize);
ReadFile(hFile,lpBits,ImageSize,&dwBytesRead, NULL);
//Пытаемся загрузить все это в битмап
BITMAP myBMP;
myBMP.bmBits=lpBits;
myBMP.bmBitsPixel=pbih->biBitCount;
myBMP.bmHeight=pbih->biHeight;
myBMP.bmWidth=pbih->biWidth;
myBMP.bmPlanes=pbih->biPlanes;
myBMP.bmType=0;
myBMP.bmWidthBytes=(pbih->biWidth * pbih->biBitCount + 15) / 16 * 2;

//Теперь загружаем сам битмап
HBITMAP hbmp = CreateBitmapIndirect(&myBMP);

//Освобождаем ресурсы
CloseHandle(hFile);
delete(pbih);
return hbmp;
}
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #1 : 06-10-2004 05:32 » 

Вычитал тут что БМП хранится в файле в перевернутом виде  Быть такого не может  Теперь понятно почему у меня перевернутое изображение Молчу  Но как мне его теперь обратно перевернуть :?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 06-10-2004 05:44 » 

USBLexus, сделай обмен строк. Типа такого:
int i;
for(i=0;i<N/2;i++) swap_bmp_lines($i,N-$i-1);
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #3 : 07-10-2004 02:45 » 

Да... наверное ничего другого мне не остается
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 07-10-2004 04:53 » 

Ерунда какаято((( Не могу читать из этого долбаного буфера куда считывается изображение

Строчки типа
char* BMPStr=new char[100];
CopyMemory((void*)BMPStr,(void*)(lpBits[0]),10);
вызывают ошибку как с этим буфером работать то теперь?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #5 : 07-10-2004 05:20 » 

С этим я разобрался вот какой еще вопрос память выделеная здесь:
BYTE* lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, ImageSize);
Освобождается по завершению программы?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Pu
Большой босс

ru
Offline Offline
78


« Ответ #6 : 07-10-2004 05:32 » 

USBLexus, цитата из мэсэдэнэ Улыбаюсь
To free the memory, use the GlobalFree function.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #7 : 07-10-2004 05:36 » 

Цитата: Pu
USBLexus, цитата из мэсэдэнэ Улыбаюсь
To free the memory, use the GlobalFree function.

Хреново
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Mad
Гость
« Ответ #8 : 16-10-2004 12:37 » 

Цитата: USBLexus
память выделеная здесь:
BYTE* lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, ImageSize);
Освобождается по завершению программы?


Форточка хранит хандлы (в том числе и для блоков памяти), привязанно к процессам. Если процес закрывается, то все открытые им хандлы тоже закрываются.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines