Я некоторое время работал над обработкой изображений и заметил странные вещи.Я читаю файл BMP, использую простые методы, такие как ReadFile и прочее, и использую структуры Microsoft BMP.Вот код:
ReadFile(_bmpFile,&bmpfh,sizeof(bfh),&data,NULL);
ReadFile(_bmpFile, &bmpih, sizeof(bih), &data, NULL);
imagesize = bih.biWidth*bih.biHeight;
image = new RGBQUAD[imagesize];
ReadFile(_bmpFile,image, imagesize*sizeof(RGBQUAD),&written,NULL);
Вот так я читаю файл и затем превращаю его в шкалу серого с помощью простого цикла for.
for (int i = 0; i < imagesize; i++)
{
RED = image[i].rgbRed;
GREEN = image[i].rgbGreen;
BLUE = image[i].rgbBlue;
avg = (RED + GREEN + BLUE ) / 3;
image[i].rgbRed = avg;
image[i].rgbGreen = avg;
image[i].rgbBlue = avg;
}
Теперь, когда язапишите файл, используя этот код:
#pragma pack(push, 1)
WriteFile(_bmpFile, &bmpfh, sizeof(bfh), &data, NULL);
WriteFile(_bmpFile, &bmpih, sizeof(bih), &data, NULL);
WriteFile(_bmpFile, image, imagesize*sizeof(RGBQUAD), &written, NULL);
#pragma pack(pop)
Файл становится намного больше (30 МБ -> 40 МБ).
Причина этого в том, что я использую RGBQUAD вместо RGBTRIPLE, ноесли я использую RGBTRIPLE, у меня проблема с преобразованием маленьких картинок в оттенки серого - не могу открыть картинку после ее создания (говорит, что она не в правильной структуре).
Такжеразмер файла пропускает один байт (1174 КБ и после 1173 КБ)
Кто-нибудь видел это раньше (это происходит только с небольшими картинками)?