Почему QDBMP не может записать 128 * 128 изображений? - PullRequest
0 голосов
/ 02 сентября 2018

Я занимаюсь разработкой приложения на c ++, которое читает некоторые растровые изображения и работает с ними, а затем сохраняет их как растровые изображения. Я использую библиотеку QDBMP для работы с растровым файлом, и все хорошо для 512 * 512 растровых изображений. но при работе с 128 * 128 растровыми файлами он просто записывает в вывод полоску. Вот мой код для чтения и записи растровых файлов:

int readBitmapImage(const char *file_name,UCHAR* r, UCHAR* g, UCHAR* b)
{
BMP* bmp;
UINT width, height;
bmp = BMP_ReadFile(file_name);
BMP_GetDepth(bmp);
BMP_CHECK_ERROR(stderr, -1);
width = BMP_GetWidth(bmp); height = BMP_GetHeight(bmp);
for (int x = 0; x < width; ++x)
{
    for (int y = 0; y < height; ++y)
    {           
        BMP_GetPixelRGB(bmp, x, y, &r[x*width+y], &g[x*width + y], &b[x*width + y]);
    }
}
BMP_CHECK_ERROR(stderr, -2); 

return 0;
}

void writeImageData(const char *file_name, UCHAR* r, UCHAR* g, UCHAR* b,int width,int height,int bitDepth)
{
    BMP* bmp=BMP_Create(width,height,bitDepth);
width = BMP_GetWidth(bmp); height = BMP_GetHeight(bmp);
for (int x = 0; x < width; ++x)
{
    for (int y = 0; y < height; ++y)
    {
        BMP_SetPixelRGB(bmp, x, y, r[x*width + y], g[x*width + y], b[x*width + y]);
    }
}
BMP_WriteFile(bmp, file_name);
}

Баки за вашу помощь

Update1 Исходное изображение: enter image description here

Результат сохранения исходного изображения: enter image description here

UPDATE2 Значение bitDepth равно 24, а кодовый блок для выделенной памяти:

    UCHAR* WimageDataR = (UCHAR*)calloc(128* 128, sizeof(UCHAR));
    UCHAR* WimageDataG = (UCHAR*)calloc(128 * 128, sizeof(UCHAR));
    UCHAR* WimageDataB = (UCHAR*)calloc(128 * 128, sizeof(UCHAR));

1 Ответ

0 голосов
/ 03 сентября 2018

Через некоторое время я наконец узнал, что не так. в функции BMP_ReadFile () функции QDBMP, когда размер изображения составляет 128 * 128, параметр заголовка ImageDataSize не будет считывать файл и имеет размер 0. поэтому я добавил этот блок кода, чтобы предотвратить эту проблему, и все в порядке.

if (bmp->Header.ImageDataSize == 0)
{
    bmp->Header.ImageDataSize = bmp->Header.FileSize - bmp->Header.DataOffset;
}
...