Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > > >
Восстановить пароль Регистрация

Ответ Создать новую тему
 
Sahon
Форумчанин
9 / 9 / 0
Регистрация: 09.04.2010
Сообщений: 139
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
Jupiter
Каратель
Эксперт C++
6435 / 3857 / 152
Регистрация: 26.03.2010
Сообщений: 9,061
Записей в блоге: 1
30.07.2011, 19:39
  #2
Цитата Сообщение от Sahon Посмотреть сообщение
Как лучше всего это осуществить?
гуглнием и подальшим переписывание на чистый С++
Sahon
Форумчанин
9 / 9 / 0
Регистрация: 09.04.2010
Сообщений: 139
30.07.2011, 21:10  [ТС]
  #3
Цитата Сообщение от Maxwe11 Посмотреть сообщение
гуглнием и подальшим переписывание на чистый С++
особенно вторым... т.к. в Билдере и Вижуал C++ я полный 0.
novi4ok
Форумчанин
542 / 495 / 7
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2011, 21:14
  #4
"чистый с++" это когда все только на бумаге, без компьютера?
Sahon
Форумчанин
9 / 9 / 0
Регистрация: 09.04.2010
Сообщений: 139
30.07.2011, 21:17  [ТС]
  #5
Цитата Сообщение от novi4ok Посмотреть сообщение
"чистый с++" это когда все только на бумаге, без компьютера?
"Чистый C++" - это без сторонних библиотек (Билдеров, Вижуал Студий и т.д.).
Jupiter
Каратель
Эксперт C++
6435 / 3857 / 152
Регистрация: 26.03.2010
Сообщений: 9,061
Записей в блоге: 1
30.07.2011, 21:19
  #6
Цитата Сообщение от novi4ok Посмотреть сообщение
"чистый с++" это когда все только на бумаге, без компьютера?
это тот котрый отработает налюбой платформе со стандартным набором библиотек

Добавлено через 25 секунд
Цитата Сообщение от Sahon Посмотреть сообщение
"Чистый C++" - это без сторонних библиотек (Билдеров, Вижуал Студий и т.д.).
ошибаетесь товарищ!
Sahon
Форумчанин
9 / 9 / 0
Регистрация: 09.04.2010
Сообщений: 139
30.07.2011, 21:22  [ТС]
  #7
Цитата Сообщение от Maxwe11 Посмотреть сообщение
ошибаетесь товарищ!
Извиняюсь, просто неправильно выразился. Без библиотек Билдера и Вижуал Студии.
ValeryS
Форумчанин
4062 / 2954 / 153
Регистрация: 14.02.2011
Сообщений: 9,970
30.07.2011, 21:34
  #8
погугли описания Bmp
насколько я помню там есть заголовок
в котором в частности описан размер, сколько байт на пиксел,количество слоев,есть ли жатие
потом может идти палитра(для БМП с палитрой)
а дальше массив байтов(но они не совпадают с пикселами) например при 2х цветной картинке один байт равен 8 пикселям
самое интересное что строки в массиве начинаются снизу (а не сверху как в картинке)
Sahon
Форумчанин
9 / 9 / 0
Регистрация: 09.04.2010
Сообщений: 139
30.07.2011, 21:40  [ТС]
  #9
Цитата Сообщение от ValeryS Посмотреть сообщение
погугли описания Bmp
насколько я помню там есть заголовок
в котором в частности описан размер, сколько байт на пиксел,количество слоев,есть ли жатие
потом может идти палитра(для БМП с палитрой)
а дальше массив байтов(но они не совпадают с пикселами) например при 2х цветной картинке один байт равен 8 пикселям
самое интересное что строки в массиве начинаются снизу (а не сверху как в картинке)
та гуглил я уже описание, но хоть убей не могу понять как это реализовать.
ValeryS
Форумчанин
4062 / 2954 / 153
Регистрация: 14.02.2011
Сообщений: 9,970
30.07.2011, 21:46
  #10
посмотри как сделано у других хотя бы в MFC
(а ну ты его не любишь )
грубо говоря создаешь структуру заголовка (она стандартного размера) в нее считываешь начало файла
анализируешь поля и в зависимсти от их создаешь массив куда считаешь тело картинки
почитай Ламонта "Програмирование игр" насколько я помню там пошагово описана работа с БМПшками
alexcoder
Форумчанин
1005 / 483 / 37
Регистрация: 03.06.2009
Сообщений: 1,808
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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
C++ Простые числа из файла в массив и обратно
Есть файл, в котором находится ряд чисел (text.txt). Эти числа нужно перенести в массив, найти среди них простые числа, а затем вывести их обратно в файл. Первую часть я сделала (то есть, перенесла...
С++ для начинающих annly 05.12.2013 23:08
C++ Builder конвертировать tiff в bmp и обратно
Есть ли какие-нибудь простенькие библиотеки для конвертирования tiff в TBitmap и обратно? Или можно ли это сделать стандартными средствами билдера? Если можно, то как?
C++ Builder Dr. Who 01.11.2013 01:11
C++ Работа с BMP-файлами (класс "8 битное BMP изображение)
Написать класс "8 битное BMP изображение".Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и конструктор копировщик.Перегрузить операторы чтения ">>" и...
С++ для начинающих Julianna24 03.06.2013 20:53
C# WinForms Чтение bmp файла в байт массив и обратно
Проблема состоит в том что я считываю в байт масив к примеру текстовый файл и потом востанавливаю все работает, но когда я считываю bmp файл и затем его востанавливаю то востановленный рисунок...
C# Windows Forms Посвященный 10.03.2013 03:47
Visual C++ Конвертация из jpg в bmp и обратно
И так, ребят, мне срочно нужна помощь! нужно при помощи MS Visual C++ переконвертировать jpg в bmp а потом обратно если кто делал, помогите пожалуйста! срочно надо! в инете копал, но особо много...
Visual C++ jackair 31.05.2012 19:13
C++ Как преобразовать массив в строку и обратно
Знаю как преобразовывать переменные в строку Но может есть в с++ какая то функция которая быстро преобразует весь массив в строку с заданным разделителем ? или возможен только вариант с ...
С++ для начинающих nill 15.05.2012 09:28
C++ Вывод информации о *.bmp на чистом C++
Собственно вот: #include <iostream> #include <fstream> #include <cmath> using namespace std; int main(int argc, char *argv) { char ch;
С++ для начинающих Sahon 31.07.2011 21:48
C++ Написать программу, формирующую по исходному BMP файлу новый BMP файл
Написать программу, формирующую по исходному BMP файлу новый BMP файл в котором правая половина является зеркальным отражением левой. Помогите пожалуйста.
С++ для начинающих DREAMspb 29.04.2011 23:09
Опции темы

Текущее время: 10:11. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.