Задать вопрос
deadrime
@deadrime
Fullstack web developer

Почему записывается лишняя информация в палитровые изображение(bmp)?

Если я все верно понял - когда глубина цвета 1,4 или 8, то после заголовков файла и изображения следует палитра размером 2 ^ BitCount (глубина цвета) цветов. А после этой палитры следует индексы цветов палитры.

Вот функция чтения
int Image::loadpaletteimg(FILE *f)
{
		int Palette_size = pow(2,BMInfoHeader.BitCount);//размер палитры - 2 в степени глубины цвета
		Palette=new RGBQUAD[Palette_size];
		
		for (int i = 0; i < Palette_size; i++) fread(&(Palette[i]),sizeof(RGBQUAD),1,f);//считываем палитру

		Rgbquad=new RGBQUAD*[BMInfoHeader.Height];//cтолбцы

		for (int i = 0; i < BMInfoHeader.Height; i++)//построчно записываем
		{
			Rgbquad[i]=new RGBQUAD[BMInfoHeader.Width];//строки
			fread(Rgbquad[i], sizeof(RGBQUAD), BMInfoHeader.Width, f);
		}
		if(Rgbquad) cout<<"\nИзображение успешно загружено!"<<endl;
		return 1;
}


А вот - для записи
void Image::writepaletteimg(FILE *f)
{
	int Palette_size = pow(2,BMInfoHeader.BitCount);
	for (int i = 0; i < Palette_size; i++)
		{
			fwrite(&(Palette[i]),sizeof(RGBQUAD),1,f);
			//cout<<i<<endl;
		}
	cout<<"Палитра записана!"<<endl;
	int size = BMInfoHeader.Height*BMInfoHeader.Width;

	for (int i = 0; i < BMInfoHeader.Height; i++)
	{
		fwrite(Rgbquad[i], sizeof(RGBQUAD), BMInfoHeader.Width, f);
	}
	fclose(f);
	return;
}


Я так понимаю, что проблема в моем двухмерном массиве, т.к для индексов он вроде как не нужен, но не совсем понимаю, что именно нужно изменить... Картинка пишется почти правильно, т.е ее можно прочитать, но вот в конец файла пишется какая-то гадость, забивая 70% картинки. Т.е если исходная картинка весит 9,05 КБ , то после перезаписи в моей программе - 32,8 КБ.
40846d3c51164e788f9eac6859a94480.jpg

Как мне переписать, чтобы не записывало лишнего?
  • Вопрос задан
  • 583 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 2
alsopub
@alsopub
От
Rgbquad=new RGBQUAD*[BMInfoHeader.Height];//cтолбцы
и ниже не понял.
Откуда там RGBQUAD и его размер...
Палитру уже прочитали на предыдущем шаге.
Ответ написан
deadrime
@deadrime Автор вопроса
Fullstack web developer
int size = BMFileHeader.Size - BMFileHeader.OffsetBits;
	palette_img = new byte[size];

	for (int i = 0;i<size;i++)
	{
		fread(&palette_img[i], 1, 1, f);
	}


int size = BMFileHeader.Size - BMFileHeader.OffsetBits;
	for (int i = 0;i<size;i++)
	{
		fwrite(&palette_img[i], 1, 1, f);
	}

Вот это в общем сработало...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
https://ru.wikipedia.org/wiki/BMP#BITMAPFILEHEADER
я тут википедию листаю и вижу что есть такое поле "Размер таблицы цветов в ячейках." последних версий формата bmp. Т.е. может стоит определять размер таблицы из заголовка, а не в степень двойки возводить.
Ответ написан
Ваш ответ на вопрос

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

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