SecurityYourFingers
@SecurityYourFingers
I make other things, but i know that without your

Как правильно создать палитру цветов для bmp изображения?

Есть файл - color2.mtx содержащий матрицу пикселей изображения.
Мне нужно взять эту матрицу, создать заголовок и всё сохранить в bmp файле.

Вылетает ошибка:
error C2011: tagRGBQUAD: переопределение типа "struct"

Ещё ошибки:
использование неопределенного типа "tagRGBQUAD"

Ещё:
выражение слева от ".rgbBlue" должно представлять класс, структуру или объединение

То есть все ошибки связаны с палитрой цветов
Подскажите пожалуйста где я ошибся и как правильно надо создавать эту палитру

вот я создаю(объявляю) этот массив(палитру)
typedef struct tagRGBQUAD {
	BYTE	 rgbBlue;	// Интенсивность синего
	BYTE	 rgbGreen; // Интенсивность зеленого
	BYTE	 rgbRed;	// Интенсивность красного
	BYTE	 rgbRserved;	// Не используется
         } RGBQUAD;

вот я заполняю этот массив(палитру)
RGBQUAD bmiData[2];          //Таблица цветов, 
for (int i=0; i<2; i++){
	 bmiData[i].rgbBlue = i*255;
	 bmiData[i].rgbGreen = i*255;
	 bmiData[i].rgbRed = i*255;
	 bmiData[i].rgbReserved = 0;
 }


вот полный код программы
// <<>><<>><<>><>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><>><<>
// Программа чтения 3-канальной матрицы изображения и сохранения ее в формате BMP
// <<>><<>><<>><>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><>><<>
#include "stdafx.h"
#include "windows.h"       //Включение файла определения API-функций Windows
#define ALING4(x) ((((x)-1)/4+1)*4) //Макрос - дополнение величины до ближайшей кратной 4
typedef struct tagRGBQUAD { //---------error C2011: tagRGBQUAD: переопределение типа "struct"
	BYTE	 rgbBlue;	// Интенсивность синего
	BYTE	 rgbGreen; // Интенсивность зеленого
	BYTE	 rgbRed;	// Интенсивность красного
	BYTE	 rgbRserved;	// Не используется
         } RGBQUAD;
struct S4Bit                        //Структура для доступа к 4-битным изображениям
{
 BYTE b1:4;
 BYTE b2:4;
};
int main(int argc, char* argv[])
{
 BITMAPFILEHEADER  File;       //Структура заголовока файла
 BITMAPINFOHEADER  Head;   //Структура параметров растра
 RGBQUAD bmiData[2];          //Таблица цветов, 
                              //не используется для 24-битных изображений
 for (int i=0; i<2; i++){
	 bmiData[i].rgbBlue = i*255; //---------error C2027: использование неопределенного типа "tagRGBQUAD"
                                                      //---------error C2228: выражение слева от ".rgbBlue" должно представлять класс, структуру или объединение
	 bmiData[i].rgbGreen = i*255; //--------error C2027:...
                                                       //--------error C2228:...
	 bmiData[i].rgbRed = i*255;//--------error C2027:...
                                                       //--------error C2228:...
	 bmiData[i].rgbReserved = 0;//--------error C2027:...
                                                       //--------error C2228:...
 }
 BYTE Bitmap[480][640/8];       //Матрица изображения
                                                       //Открытие файла матрицы изображения
 HFILE hFile=_lopen("c:\\Лабораторные_работы_ГИС\\BMP\\color2.mtx",OF_READ);
 if (hFile != HFILE_ERROR) //Если файл открылся нормально
 {
  _lread(hFile,Bitmap,480*640/8); //Читаем матрицу изображения
  _lclose(hFile);                               //закрываем файл
                                                         //Определяем параметры файлового заголовка
  ZeroMemory(&Head,sizeof(Head)); //Заполнение структуры нулевыми значениями
                                  //Заполнение необходимых полей параметров растра
  Head.biSize=40;
  Head.biHeight=480;
  Head.biWidth=640;
  Head.biPlanes=1;
  Head.biBitCount=1;
  Head.biCompression=0;
  Head.biSizeImage=0;
  Head.biXPelsPerMeter=72;
  Head.biYPelsPerMeter=72;
  Head.biClrUsed=2;
  Head.biClrImportant=2;
                                                     //Заполнение структуры заголовка файла
  File.bfOffBits=sizeof(Head) + 8 + sizeof(File);
  File.bfSize=sizeof(File) + 8 + sizeof(Head) + 640/80*480; //Размер файла
  File.bfType='B' + (int)'M'*256;                                     //Тип файла
                                                           //Создание нового файла на диске с именем 1.bmp
  hFile=_lcreat("c:\\Users\\442\\newPic.bmp",0);
  if (hFile != HFILE_ERROR)
  {
   _lwrite(hFile,(const char *)&File,sizeof(File));     //Сохранение заголовка файла
   _lwrite(hFile,(const char *)&Head,sizeof(Head)); //Сохранение параметров растра
   _lwrite(hFile,(const char *)&bmiData, 8); //Сохранение параметров растра
   _lwrite(hFile,(const char *)Bitmap,480*640/80);   //Сохранение матрицы изображе-ния
   _lclose(hFile);                                                         //Закрытие файла
  }
  else MessageBox(0,L"Ошибка создания файла BMP",L"Ошибка",MB_OK); 
 }
 else MessageBox(0,L"Ошибка открытия файла изображения",L"Ошибка",MB_OK);
 return 0;
}

  • Вопрос задан
  • 145 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы