Форум программистов, компьютерный форум CyberForum.ru
С наступающим Новым годом!
CyberForum.ru - форум программистов и сисадминов > > >
Восстановить пароль Регистрация
 
Sahon
Форумчанин
10 / 10 / 0
Регистрация: 09.04.2010
Сообщений: 141
30.07.2011, 19:11     BMP в массив и обратно (на чистом С++)   #1
Надо загнать изображение BMP, допустим, 100x200 пикселей, в двухмерный массив 100x200 (то-есть 20 000 ячеек). Чтобы потом можно было изображение обратно вогнать в файл из массива. Как лучше всего это осуществить?

P.S. Все это мне надо сделать на чистом C++.

P.P.S. На сколько я знаю, файл *.bmp состоит не только из самого изображение, но и его информационной части (количество цветов, размер и т.д.)
AdAgent
Объявления
30.07.2011, 19:11     BMP в массив и обратно (на чистом С++)
Jupiter
Каратель
Эксперт C++
6459 / 3881 / 158
Регистрация: 26.03.2010
Сообщений: 9,131
Записей в блоге: 1
30.07.2011, 19:39     BMP в массив и обратно (на чистом С++)   #2
Цитата Сообщение от Sahon Посмотреть сообщение
Как лучше всего это осуществить?
гуглнием и подальшим переписывание на чистый С++
Sahon
Форумчанин
10 / 10 / 0
Регистрация: 09.04.2010
Сообщений: 141
30.07.2011, 21:10  [ТС]     BMP в массив и обратно (на чистом С++)   #3
Цитата Сообщение от Maxwe11 Посмотреть сообщение
гуглнием и подальшим переписывание на чистый С++
особенно вторым... т.к. в Билдере и Вижуал C++ я полный 0.
novi4ok
Форумчанин
542 / 495 / 7
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2011, 21:14     BMP в массив и обратно (на чистом С++)   #4
"чистый с++" это когда все только на бумаге, без компьютера?
Sahon
Форумчанин
10 / 10 / 0
Регистрация: 09.04.2010
Сообщений: 141
30.07.2011, 21:17  [ТС]     BMP в массив и обратно (на чистом С++)   #5
Цитата Сообщение от novi4ok Посмотреть сообщение
"чистый с++" это когда все только на бумаге, без компьютера?
"Чистый C++" - это без сторонних библиотек (Билдеров, Вижуал Студий и т.д.).
AdAgent
Объявления
30.07.2011, 21:17     BMP в массив и обратно (на чистом С++)
Jupiter
Каратель
Эксперт C++
6459 / 3881 / 158
Регистрация: 26.03.2010
Сообщений: 9,131
Записей в блоге: 1
30.07.2011, 21:19     BMP в массив и обратно (на чистом С++)   #6
Цитата Сообщение от novi4ok Посмотреть сообщение
"чистый с++" это когда все только на бумаге, без компьютера?
это тот котрый отработает налюбой платформе со стандартным набором библиотек

Добавлено через 25 секунд
Цитата Сообщение от Sahon Посмотреть сообщение
"Чистый C++" - это без сторонних библиотек (Билдеров, Вижуал Студий и т.д.).
ошибаетесь товарищ!
Sahon
Форумчанин
10 / 10 / 0
Регистрация: 09.04.2010
Сообщений: 141
30.07.2011, 21:22  [ТС]     BMP в массив и обратно (на чистом С++)   #7
Цитата Сообщение от Maxwe11 Посмотреть сообщение
ошибаетесь товарищ!
Извиняюсь, просто неправильно выразился. Без библиотек Билдера и Вижуал Студии.
ValeryS
Форумчанин
4396 / 3209 / 187
Регистрация: 14.02.2011
Сообщений: 10,835
30.07.2011, 21:34     BMP в массив и обратно (на чистом С++)   #8
погугли описания Bmp
насколько я помню там есть заголовок
в котором в частности описан размер, сколько байт на пиксел,количество слоев,есть ли жатие
потом может идти палитра(для БМП с палитрой)
а дальше массив байтов(но они не совпадают с пикселами) например при 2х цветной картинке один байт равен 8 пикселям
самое интересное что строки в массиве начинаются снизу (а не сверху как в картинке)
Sahon
Форумчанин
10 / 10 / 0
Регистрация: 09.04.2010
Сообщений: 141
30.07.2011, 21:40  [ТС]     BMP в массив и обратно (на чистом С++)   #9
Цитата Сообщение от ValeryS Посмотреть сообщение
погугли описания Bmp
насколько я помню там есть заголовок
в котором в частности описан размер, сколько байт на пиксел,количество слоев,есть ли жатие
потом может идти палитра(для БМП с палитрой)
а дальше массив байтов(но они не совпадают с пикселами) например при 2х цветной картинке один байт равен 8 пикселям
самое интересное что строки в массиве начинаются снизу (а не сверху как в картинке)
та гуглил я уже описание, но хоть убей не могу понять как это реализовать.
ValeryS
Форумчанин
4396 / 3209 / 187
Регистрация: 14.02.2011
Сообщений: 10,835
30.07.2011, 21:46     BMP в массив и обратно (на чистом С++)   #10
посмотри как сделано у других хотя бы в MFC
(а ну ты его не любишь )
грубо говоря создаешь структуру заголовка (она стандартного размера) в нее считываешь начало файла
анализируешь поля и в зависимсти от их создаешь массив куда считаешь тело картинки
почитай Ламонта "Програмирование игр" насколько я помню там пошагово описана работа с БМПшками
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2011, 18:01     BMP в массив и обратно (на чистом С++)
Еще ссылки по теме:

C++ Простые числа из файла в массив и обратно
C++ Задача на чистом Си. Массивы
C++ Записать в массив RGB-цвета bmp-файла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alexcoder
Форумчанин
1032 / 510 / 43
Регистрация: 03.06.2009
Сообщений: 2,041
31.07.2011, 18:01     BMP в массив и обратно (на чистом С++)   #11
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//Открытие БМП-файла, возвращает массив битовых данных и через указатель структуру 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);
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;                     //возвращаем битовые данные
}
Возвращается массив глубиной 24 бита.
Yandex
Объявления
31.07.2011, 18:01     BMP в массив и обратно (на чистом С++)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Опции темы

Текущее время: 07:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.
Яндекс.Метрика