2010-11-01 2 views
0

Я создам обнаружение края с помощью оператора Sobel, если мне удалось создать двойной массив, который сохраняет значения пикселей в 8-битном BMP-файле. После выполнения программы он создает файл с биполярным надзором: что может быть недостающим? Спасибо за помощь!! Вот photosФайл неожиданного вывода (BMP)

#include <stdio.h> 
#include <stdlib.h> 

#pragma pack(2) 
typedef struct tagBITMAPFILEHEADER { 
    unsigned short bfType; 
    unsigned int bfSize; 
    unsigned short int bfReserved1; 
    unsigned short int bfReserved2; 
    unsigned int bfOffBits; 
} BITMAPFILEHEADER; 


#pragma pack() 
typedef struct tagBITMAPINFOHEADER { 
    unsigned int biSize; 
    unsigned int biWidth; 
    unsigned int biHeight; 
    unsigned short biPlanes; 
    unsigned short biBitCount; 
    unsigned int biCompression; 
    unsigned int biSizeImage; 
    unsigned int biXPelsPerMeter; 
    unsigned int biYPelsPerMeter; 
    unsigned int biClrUsed; 
    unsigned int biClrImportant; 
} BITMAPINFOHEADER; 

typedef struct pixel { 
    unsigned char intensity; 
} PIXEL; 


int main(int argc, char *argv[]) 
{ 
    if(argc != 4) 
    { 
    printf("Usage: %s input.bmp output.bmp output.txt\n", argv[0]); 
    exit(-1); 
    } 

    FILE *filePtr; 
    FILE *bin; 
    FILE *write; 
    BITMAPFILEHEADER bitmapFileHeader; 
    BITMAPINFOHEADER bitmapInfoHeader; 
    int i, j; 

    write = fopen(argv[3], "w"); 
    filePtr = fopen(argv[1],"rb"); 
    bin = fopen(argv[2], "wb"); 
    if (filePtr == NULL) 
    { 
    printf("File could not opened\n"); 
    exit(-1); 
    } 

    fread(&bitmapFileHeader, sizeof(bitmapFileHeader), 1, filePtr); 
    fread(&bitmapInfoHeader, sizeof(bitmapInfoHeader), 1, filePtr); 

    fwrite(&bitmapFileHeader, 1, sizeof(bitmapFileHeader), bin); 
    fwrite(&bitmapInfoHeader, 1, sizeof(bitmapInfoHeader), bin); 

    int offset = sizeof(bitmapFileHeader) + sizeof(bitmapInfoHeader); 

    if (bitmapFileHeader.bfType !=0x4D42) 
    { 
    fclose(filePtr); 
    printf("Not a bmp file\n"); 
    exit(-1); 
    } 

    if(bitmapInfoHeader.biBitCount > 8) 
    { 
    printf("Only for Gray-scale 8 bits per pixel Image\n"); 
    printf("%s is %u bits per pixel Image\n", argv[1], bitmapInfoHeader.biBitCount); 
    exit(-1); 
    } 

    fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET); 
    PIXEL **pixelArray = (PIXEL **)malloc(sizeof(PIXEL*)*bitmapInfoHeader.biWidth); 

    for(i = 0; i < bitmapInfoHeader.biWidth; i++) 
    { 
    pixelArray[i] = (PIXEL *)malloc(sizeof(PIXEL)*bitmapInfoHeader.biHeight); 
    } 

    if (!pixelArray) 
    { 
    for(i = 0; i < bitmapInfoHeader.biWidth; i++) 
    { 
     free(pixelArray[i]); 
    } 
    free(pixelArray); 
    fclose(filePtr); 
    printf("Memory could not be allocated\n"); 
    exit(-1); 
    } 

    for (i = 0; i < bitmapInfoHeader.biWidth; i++){ 
    for(j = 0; j < bitmapInfoHeader.biHeight; j++){ 
     PIXEL pixel; 
     fread(&pixel, sizeof(pixel), 1, filePtr); 
     fwrite(&pixel, 1, sizeof(pixel), bin); 
     pixelArray[i][j].intensity = pixel.intensity; 
     fseek(filePtr, sizeof(pixel), SEEK_CUR); 
     offset++; 
     if(offset == bitmapInfoHeader.biSizeImage) 
      break; 
    } 
    } 

    for (i = 0; i < bitmapInfoHeader.biWidth; i++){ 
    for(j = 0; j < bitmapInfoHeader.biHeight; j++){ 
     printf("[%d][%d]:%d", i, j, pixelArray[i][j].intensity); 
     fprintf(write, "%d ", pixelArray[i][j].intensity); 
    } 
     printf("\n"); 
     fprintf(write, "\n"); 
    } 


    fclose(filePtr); 
    fclose(write); 
    fclose(bin); 
    for(i = 0; i < bitmapInfoHeader.biWidth; i++) 
    { 
    free(pixelArray[i]); 
    } 
    free(pixelArray); 

    return 0; 

} 
+1

Что такое язык C, который заставляет их практикующих снова изобретать чтение файла изображения снова и снова? –

+1

Считаете ли вы использование netpbm (http://netpbm.sourceforge.net/) или GraphicsMagick (http://www.graphicsmagick.org/) для чтения BMP-файла? Они позаботятся обо всех выравниваниях, порядке байтов, различиях версии формата файла, ... проблемах для вас. –

ответ

2

Возможные проблемы:

  • Вы предполагаете, что sizeof(PIXEL) == 1 (она вполне может не быть, так как это структура - вы должны проверить) - вероятно, лучше, чтобы это изменить к простому ЬурейеМу все равно

  • вы не заботясь о строке заполнения (может быть проблемой, если ширина изображения не кратна 4)

  • там, вероятно, будет палитра, которую вы не допускающей для

Вы должны проверить поля в заголовке BMP, чтобы увидеть, что фактический формат, и убедитесь, что размер данных как и ожидалось.

Обратите также внимание на то, что ваша обработка ошибок для сбоя распределения памяти не работает.

Смежные вопросы