Я пытаюсь преобразовать цветное изображение BMP 24bpp в изображение BMP в градациях серого 8bpp. Я что-то сделал, но я не получаю 100% правильный вывод.
Я преобразовал 24bpp в 8bpp. но в результате таблица цветов изображения также рассматривается как данные пикселей. Я попытался установить байт смещения в заголовке, но проблема все еще сохраняется.
#include <stdio.h>
int main()
{
FILE* fIn = fopen("lena_colored_256.bmp","rb");
FILE* fOut = fopen("lena_gray.bmp", "w+");
int i, j, y;
unsigned char byte[54];
unsigned char colorTable[1024];
if (fIn == NULL)// check if the input file has not been opened
{
printf("File does not exist.\n");
}
for (i = 0; i < 54; i++)//read the 54 byte header from fIn
{
byte[i] = getc(fIn);
}
byte[28] = (unsigned char)8; // write code to modify bitDepth to 8
byte[11] = (unsigned char)04;
//write code to add colorTable
for (i = 0; i < 256; i++)
{
colorTable[i * 4 + 0] = i;
colorTable[i * 4 + 1] = i;
colorTable[i * 4 + 2] = i;
colorTable[i * 4 + 3] = i;
}
for (i = 0; i < 54; i++)
{
putc(byte[i], fOut);
}
for (i = 0; i < 1024; i++)
{
putc(colorTable[i], fOut);
}
// extract image height, width and bitDepth from imageHeader
int *height = (int)& byte[18];
int *width = (int)& byte[22];
int *bitDepth = (int)& byte[28];
printf("bitDepth : %d\n", *bitDepth);
printf("width: %d\n", *width);
printf("height: %d\n", *height);
int size = (*height) * (*width)*3; //calculate image size
unsigned char* buffer;
buffer = (unsigned char*)malloc(sizeof(int) * size);
for (i = 0; i < size; i=i+3) //RGB to gray
{
buffer[i+2] = getc(fIn);//blue
buffer[i+1] = getc(fIn);//green
buffer[i+0] = getc(fIn);//red
y = (buffer[i+0] * 0.33) + (buffer[i+1] * 0.33) + (buffer[i+2] * 0.33);
putc(y, fOut);
}
fclose(fOut);
fclose(fIn);
return 0;
}
Данные таблицы цветов также рассматриваются как пиксельные данные изображения. я проверил ввод данных таблицы цветов в файл BMP. Я распечатал местоположение указателя файла, после ввода 94-го байта он увеличивается на 2 байта вместо 1 байта, всего это происходит 4 раза, а другой указатель файла 1020 раз увеличивается на 1 байт. Любое объяснение по этому поводу?
unsigned char
здесь правильно. - person David C. Rankin   schedule 25.07.2019bfSize
,bfOffset
,biSizeImage
иbiBitCount
. Кроме того, необходимо правильно обрабатывать байты заполнения (каждая строка данных изображения должна содержать число, кратное четырем байтам). Обратите внимание, что байты заполнения включены вbfSize
иbiSizeImage
. И размер палитры включен вbfSize
иbfOffset
. - person user3386109   schedule 25.07.2019"lena_colored_256.bmp"
, что предполагает, что ввод является 8-битным. Покажи распечатку дляprintf("bitDepth : %d\n", *bitDepth);
- person Barmak Shemirani   schedule 27.07.2019