Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2012, 11:23   #1
Artiomtb
Пользователь
 
Регистрация: 17.11.2011
Сообщений: 10
По умолчанию Сравнение двух bmp картинок одинакового размера

Есть две bmp картинки. Необходимо их сравнить. Для начала возникла сложность в "переводе" картинки в интовую матрицу такого же размера.
Подскажите функции, которыми можно это реализовать (подключить картинку к программе, узнать её размеры, выделить цвет из конкретного пикселя, конвертировать его в инт) Язык Visual C++ .
Artiomtb вне форума Ответить с цитированием
Старый 15.09.2012, 08:50   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Код:
//Открытие БМП-файла, возвращает массив битовых данных и через указатель структуру BITMAPINFOHEADER с параметрами битовых данных
unsigned char *OpenBitmap(char name[],BITMAPINFOHEADER *retbih)
{
HANDLE hbmp,mapfile;	//Хэндлы открытых файлов
BITMAPFILEHEADER *bfh;			//Файловый заголовок
BITMAPINFOHEADER *bih;       //Информационный заголовок файла
BITMAPINFO *bi;					//BITMAPINFO
unsigned char *mf,*bits,*newbits;//указатели на блоки памяти
unsigned int size;				//Зазмер файла
unsigned int index;				//используется для преобразования индексного цвета в truecolor
unsigned int newsts,oldsts;	//размер новой и старой строки битовой карты в байтах
hbmp=CreateFile(name,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//открываем файл из командной строки
if(hbmp==INVALID_HANDLE_VALUE)	//Если не открылся
	{
   return 0;							//возвращаем ошибку
   }
size=GetFileSize(hbmp,NULL);	//получаем его размер
mapfile = CreateFileMapping(hbmp,NULL,PAGE_READWRITE,0,size,"MyFileMappingObject");	//получаем хэндл маппирования
mf = (unsigned char*)MapViewOfFile(mapfile,FILE_MAP_ALL_ACCESS ,0,0,size);//Маппируем файл на участок памяти (то есть теперь файл представляет собой массим из байт в памяти)
bfh=(BITMAPFILEHEADER*)mf;//инициализируем указатель на файловый заголовок файла
if(bfh->bfType!=0x4d42)		//Если сигнатура файла не равна BM
	{
   return 0;                               //возвращаем ошибку
   }
bih=(BITMAPINFOHEADER*)(mf+0xe);            //инициализируем указатель на информационный заголовок файла
bi=(BITMAPINFO*)(mf+0xe);                   //инициализируем указатель на структуру BITMAPINFO
bits=mf+bfh->bfOffBits;                     //массив с растровыми данными
oldsts=(bfh->bfSize-bfh->bfOffBits)/bih->biHeight;	//длина строки растра в байтах старого файла
newsts=bih->biWidth*3;								//длина строки растра в байтах нового файла
if((newsts&3)!=0)newsts=newsts&0xfffffffc+4;  //если размер стртки не кратен 4, то дополняем его до 4
newbits=new unsigned char[newsts*bih->biHeight];	//Массив нового растра
memset(newbits,0,newsts*bih->biHeight);
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 15.09.2012, 08:50   #3
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Код:
for(int i=0;i!=bih->biHeight;i++)        //Идем по каждому пикселю
  for(int j=0;j!=bih->biWidth;j++)
    {
    switch(bih->biBitCount)		//и в зависимости от глубины цвета преобразовываем при помощи разных алгоритмов
      {
      case 1:							//для 1 бита на пиксель
         {
			index=(bits[i*oldsts+j/8]>>(7-j&7))&1;			//получаем цвет пикселя, как индекс в палитре файла
         newbits[i*newsts+j*3]=bi->bmiColors[index].rgbBlue;       //Заполняем массив битовых данных соответствующим цветом из палитры
         newbits[i*newsts+j*3+1]=bi->bmiColors[index].rgbGreen;
         newbits[i*newsts+j*3+2]=bi->bmiColors[index].rgbRed;
         break;
         }
      case 4:                    //для 4 бит на пиксель
         {
			index=(bits[i*oldsts+j/2]>>((1-j%2)*4))&0xf; //получаем цвет пикселя, как индекс в палитре файла
         newbits[i*newsts+j*3]=bi->bmiColors[index].rgbBlue;       //Заполняем массив битовых данных соответствующим цветом из палитры
         newbits[i*newsts+j*3+1]=bi->bmiColors[index].rgbGreen;
         newbits[i*newsts+j*3+2]=bi->bmiColors[index].rgbRed;
         break;
         }
      case 8:                   //для 8 бит на пиксель
         {
			index=bits[i*oldsts+j];                     //получаем цвет пикселя, как индекс в палитре файла
         newbits[i*newsts+j*3]=bi->bmiColors[index].rgbBlue;       //Заполняем массив битовых данных соответствующим цветом из палитры
         newbits[i*newsts+j*3+1]=bi->bmiColors[index].rgbGreen;
         newbits[i*newsts+j*3+2]=bi->bmiColors[index].rgbRed;
         break;
         }
      case 16:                  //для 16 бит на пиксель
         {
			index=bits[i*oldsts+j*2]+(bits[i*oldsts+j*2+1]<<8);      //берем 16 бит цвета
         newbits[i*newsts+j*3]=(index&0x1f)<<3;						//разлагаем на составляющие (красный, зеленый, синий)
         newbits[i*newsts+j*3+1]=(index&0x3e0)>>2;					//и преобразуем каждую 5-битную составляющую в 8-битную
         newbits[i*newsts+j*3+2]=(index&0x7c00)>>7;
         break;
         }
      case 24:                 //для 24 бит на пиксель
         {
         newbits[i*newsts+j*3]=bits[i*oldsts+j*3];				//копируем цветовые составляющие из старого файла в новый
         newbits[i*newsts+j*3+1]=bits[i*oldsts+j*3+1];
         newbits[i*newsts+j*3+2]=bits[i*oldsts+j*3+2];
         break;
         }
      }
    }

retbih->biBitCount=24;			//количество бит на пиксель
retbih->biCompression=BI_RGB;	//без компрессии
retbih->biSizeImage=newsts*bih->biHeight;	//размер изображения
retbih->biSize=sizeof(BITMAPINFOHEADER);	//размер заголовка
retbih->biWidth=bih->biWidth;		//ширина растра
retbih->biHeight=bih->biHeight;	  //высота растра
retbih->biPlanes=1;					//количестао плоскостей, должно быть 1
retbih->biXPelsPerMeter=bih->biXPelsPerMeter;//разрешение пикселей на метр
retbih->biYPelsPerMeter=bih->biYPelsPerMeter;

UnmapViewOfFile(mf);                 //Закрываем маппирование
CloseHandle(mapfile);                //закрываем файл
CloseHandle(hbmp);                   //закрываем файл
return newbits;						//возвращаем битовые данные
}
Эта функция возвращает массив байт, переделать в массив int не составит труда.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранение картинок bmp в DLL библиотеке T-dayne Общие вопросы Delphi 3 09.04.2014 21:14
Сравнение картинок Astron Мультимедиа в Delphi 16 29.04.2010 02:22
Изменение размера картинок методом php InCun PHP 9 26.10.2009 10:21
Использование картинок (.bmp) из ресурсов Rekcilf Win Api 3 24.06.2009 00:31
Изменение размера - Сжатие BMP в TImage Air Помощь студентам 2 02.03.2008 17:00