Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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


Ответ
 
Опции темы
Старый 11.04.2013, 18:00   #1
s-mumrik
 
Регистрация: 24.05.2012
Сообщений: 4
Сообщение Классы. Чтение и создание .bmp изображения. Пропадает 1 пиксел при создании изображения.

Ребята, помогите, не могу найти в чем проблема, пропадает верхний правый пиксел при создании нового изображения. И еще проблема с конструктором по умолчанию, не разберусь никак, как написать заголовок .bmp файла. Файл вложил, 24-битный bmp файл.

Код:
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
 
using namespace std;
 
#pragma pack(1) 
  
typedef struct BitMapFileHeader{
    WORD bfType;
    DWORD bfSize;
    WORD bfReserved_1, bfReserved_2;
    DWORD bfOffBits;                
};
 
typedef struct BitMapInfoHeader{
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount; 
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
};
 
typedef struct RGB_Struct{
    char rgbBlue;
	char rgbGreen;
	char rgbRed;
   // char rgbReserved;
};
 
 class image
{
	private: 
		BitMapFileHeader file_header; 
        BitMapInfoHeader info_header;
        RGB_Struct rgb_l;
		char** r;
		char** g;
		char** b;
		char** rr;
		FILE *f1;
	public: 
		image();
		image(char *name);
		void create();
};

 /*image::image()
 {
	 memset (&file_header, 0, sizeof(file_header));
	file_header.bfType=0x4D42;
	file_header.bfOffBits = sizeof(file_header) + sizeof(info_header) + 1024;
	file_header.bfSize = file_header.bfOffBits + 
         sizeof(0x1f02)*100*100+ 
         100*((sizeof(0x1f02)*100) % 4);
	memset (&info_header, 0, sizeof(info_header));
	info_header.biSize = sizeof(info_header);
	info_header.biBitCount = 24;
	info_header.biClrUsed=16777216;
	info_header.biCompression = BI_RGB;
	info_header.biHeight=100;
	info_header.biWidth=100;
	info_header.biPlanes= 1;
 }*/

 image::image(char *name)
 {
	int i;
	if ((f1=fopen(name, "rb"))==NULL)
	{
			printf("file not found \n");
			exit(1);
	 }
	fread(&file_header, sizeof(file_header),1 ,f1);
	 fread(&info_header, sizeof(info_header), 1, f1);
	  fread(&rgb_l, sizeof(rgb_l), 1, f1);

		r=new char*[info_header.biHeight]; 
		for(int i=0; i<info_header.biHeight;i++) 
		{ 
			r[i]=new char[info_header.biWidth]; 
		} 

		g=new char*[info_header.biHeight]; 
		for(i=0; i<info_header.biHeight;i++) 
		{ 
			g[i]=new char[info_header.biWidth]; 
		} 

		b=new char*[info_header.biHeight]; 
		for(i=0; i<info_header.biHeight;i++) 
		{ 
			b[i]=new char[info_header.biWidth]; 
		} 

	//	rr=new char*[info_header.biHeight]; 
	//	for( i=0; i<info_header.biHeight;i++) 
	//	{ 
	//		rr[i]=new char[info_header.biWidth]; 
	//	} 

		fseek(f1, file_header.bfOffBits, SEEK_SET);
		fread(&rgb_l, sizeof(rgb_l), 1, f1);
		for(i=0; i<info_header.biHeight;i++) 
		{
			for(int j=0; j<info_header.biWidth;j++) 
			{
				fread(&rgb_l, sizeof(rgb_l), 1, f1);
				b[i][j]=rgb_l.rgbBlue;
				g[i][j]=rgb_l.rgbGreen;
				r[i][j]=rgb_l.rgbRed;
			//	rr[i][j]=rgb_l.rgbReserved;
			}
		}
		fclose(f1);
 }

 void image::create()
 {
	FILE *f2;
	if ((f2=fopen("D:\\temp.bmp", "wb"))==NULL)
	{
		printf("file not created \n");
	}
	fwrite(&file_header, sizeof(file_header), 1, f2);
    fwrite(&info_header, sizeof(info_header), 1, f2);
	fseek(f2, file_header.bfOffBits, SEEK_SET);
	size_t padding = 0;
    if ((info_header.biWidth * 3) % 4) padding = 4 - (info_header.biWidth * 3) % 4;
 
        for(int i=0;i< info_header.biHeight;i++)
        {
                for (int j = 0; j < info_header.biWidth; j++)
				{
					rgb_l.rgbBlue=b[i][j];
					rgb_l.rgbGreen=g[i][j];
					rgb_l.rgbRed=r[i][j];
				   // rgb_l.rgbReserved=rr[i][j];
                    fwrite(&rgb_l, sizeof(rgb_l), 1, f2);
					//fwrite(&rgb_l.rgbBlue, sizeof(rgb_l.rgbBlue), 1, f3);
                }
			 if(padding != 0) 
			 {
				fread(&rgb_l, padding,1, f1);
				fwrite(&rgb_l, padding, 1, f2);
			 }   
        }
		fclose(f2);
 }

int main()
{
	image obj1("D:\\3.bmp");
	obj1.create();
   // getch();
    return 0;
}
Изображения
Тип файла: bmp 3.bmp (29.4 Кб, 135 просмотров)

Последний раз редактировалось s-mumrik; 11.04.2013 в 18:05. Причина: Оптимизация наглядности
s-mumrik вне форума Ответить с цитированием
Старый 12.04.2013, 08:05   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,314
По умолчанию

Код:
fread(&file_header, sizeof(file_header),1 ,f1);
fread(&info_header, sizeof(info_header), 1, f1);
fread(&rgb_l, sizeof(rgb_l), 1, f1);
Зачем третий fread?
Он же есть после того, как сделан fseek - зачем?
Зачем три отдельных цикла под выделение памяти если можно уложиться в один?
Ну и наконец, зачем считывать данные в три разных массива? А кстати, что будет, если в файле 16 или 32 бита на пиксель?
waleri вне форума Ответить с цитированием
Старый 12.04.2013, 19:43   #3
s-mumrik
 
Регистрация: 24.05.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Зачем третий fread?
Он же есть после того, как сделан fseek - зачем?
Согласен, незачем, исправим.

Цитата:
Зачем три отдельных цикла под выделение памяти если можно уложиться в один?
Это уже мои причуды.
Цитата:
Ну и наконец, зачем считывать данные в три разных массива?
Мне еще нужно с изображением поработать, с каждым каналом.
Цитата:
А кстати, что будет, если в файле 16 или 32 бита на пиксель?
Можно и 16 использовать, по идее должна работать, а для 32-х бит используется еще один канал
Код:
char rgbReserved;
я его пока убрал. У меня сейчас хотя бы проблему с пикселом решить. Я тут выяснил, что в первую строчку он записывает не до конца, оставляет одну ячейку и информацию, которая должна была там записаться переводит и записывает на новую строчку.

Последний раз редактировалось s-mumrik; 12.04.2013 в 20:13.
s-mumrik вне форума Ответить с цитированием
Старый 12.04.2013, 20:21   #4
s-mumrik
 
Регистрация: 24.05.2012
Сообщений: 4
По умолчанию

Ну все, разобрался с "пропавшим" пикселом, помогите конструктор по умолчанию запилить)
s-mumrik вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись и чтение BMP-изображения БалаШагаЛ Win Api 1 31.12.2011 15:05
Запись и чтение BMP-изображения БалаШагаЛ Win Api 0 31.12.2011 13:31
Структура BMP изображения kotkota Помощь студентам 1 17.10.2011 21:03
bmp изображения в rtf Richard22 Общие вопросы Delphi 10 15.05.2010 15:29
Чтение изображения из базы данных, Вместо изображения - "System.Byte[]" ruelCrow Общие вопросы .NET 3 10.07.2008 22:29


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS