2016-04-13 20 views
0
// 
// main.c 
// cbp 
// 
// Created by Zhan on 16/4/13. 
// Copyright © 2016年 Zhan. All rights reserved. 
// 
#include <stdio.h> 
#include <stdlib.h> 
#include<math.h> 

#pragma pack(2) 

typedef unsigned short int WORD; 
typedef unsigned int DWORD; 

typedef struct BMP_FILE_HEADER 
{ 
    WORD bType; 
    DWORD bSize; 
    WORD bReserved1; 
    WORD bReserved2; 
    DWORD bOffset; 
} BMPFILEHEADER; 

typedef struct BMP_INFO 
{ 
    DWORD bInfoSize; 
    DWORD bWidth; 
    DWORD bHeight; 
    WORD bPlanes; 
    WORD bBitCount; 
    DWORD bCompression; 
    DWORD bmpImageSize; 
    DWORD bXPelsPerMeter; 
    DWORD bYPelsPerMeter; 
    DWORD bClrUsed; 
    DWORD bClrImportant; 
} BMPINF; 

/*彩色表*/ 
typedef struct RGB_QUAD 
{ 
    WORD rgbBlue; 
    WORD rgbGreen; 
    WORD rgbRed; 
    WORD rgbReversed; 
} RGBQUAD; 

int main() 
{ 
    FILE *fp,*fpout; 
    BMPFILEHEADER fileHeader; 
    BMPINF infoHeader; 
    int width, height; 
    //WORD c; 
    int s; 
    float s1,s2; 
    unsigned char **image; 

    if((fp = fopen("XG.bmp", "rb")) == NULL) 
    { 
     printf("Cann't open the file!\n"); 
    } 


    fseek(fp, 0, 0); 
    fread(&fileHeader, sizeof(fileHeader), 1, fp); 
    fread(&infoHeader, sizeof(infoHeader), 1, fp); 

    printf("size fileHeader == %ld\n",sizeof(fileHeader)); 
    printf("size infoHader == %ld\n",sizeof(infoHeader)); 

    width = infoHeader.bWidth; 
    height = abs(infoHeader.bHeight); 

    printf("infoHeader.bWidth == %d\n",width); 
    printf("infoHeader.bheight == %d\n",height); 

    image = (unsigned char **)malloc(sizeof(unsigned char *) * width); 
    image[0] = (unsigned char *)malloc(sizeof(unsigned char) * width * height); 

    // unsigned char **image1 =(unsigned char**) malloc (width*sizeof(int*)); 
    // for(int i=0;i<width;i++) 
    //  *image1++=(unsigned char*) malloc (height*sizeof(int)); 

    fseek(fp,(sizeof(fileHeader)+sizeof(infoHeader)),SEEK_SET); 
    for(int i=0;i<width;i++) 
    { 
     for(int j=0;j<height;j++){ 
      fread(&image[i][j],1,1,fp); }}  //Memory leak ? 
    for(int i=1;i<width;i++){ 
     for(int j=1;j<height;j++) 
     { 
      s1=image[i-1][j+1]+2*image[i][j+1]+image[i+1][j+1]; 
      s1=s1-image[i-1][j-1]-2*image[i][j-1]-image[i+1][j-1]; 
      s2=image[i-1][j-1]+2*image[i-1][j]+image[i-1][j+1]; 
      s2=s2-image[i+1][j-1]-2*image[i+1][j]-image[i+1][j+1]; 
      s=fabs(s1)+fabs(s2); 
      if(s>80) 
       image[i][j]=255; 
      else 
       image[i][j]=0; 
     } 
    } 
    if((fpout=fopen("za.bmp","wb"))==NULL){ 
     printf("cannot open outfile!\n"); 
     free(image[0]); 
     free(image); 
     return 0; 
    } 
    printf("intoWrite\n"); 
    fwrite(&fileHeader,sizeof(fileHeader),1,fpout); 
    fwrite(&infoHeader,sizeof(infoHeader),1,fpout); 
    for(int i=0;i<width;i++) 
    { 
     for(int j=0;j<height;j++){ 
      printf("forWrite\n"); 
      fwrite(&image[i][j],1,1,fpout);}} 
    // c = fgetc(fp); 
    // int mi=0,mj=0; 
    // while (!feof(fp)) 
    // { 
    //  fwrite(&c,1,1,fpout); 
    //  mi++;mj++; 
    // c = fgetc(fp); 
    // } 
    free(image[0]); 
    free(image); 
    printf("OK!\n"); 
    fclose(fp); 
    fclose(fpout); 
    return 0; 
} 

Dies ist mein Code für bmp Rand detection.I Xcode verwenden Sie diesen Code ausführen, fordert es immer "Thread 1: EXC_BAD_ACCESS (code = 1, Adresse = 0x0)" oder „Funktionsaufruf Argument ist ein nicht initialisierter Wert "at" fread (& Bild [i] [j], 1,1, fp) ". Warum habe ich statische zweidimensionale Arrays verwendet, gibt es keinen Fehler, aber dynamische zweidimensionale Array ist Fehler?Der Zeiger von C-Code

Antwort

0
image=(WORD **)calloc(width,sizeof(WORD*)); 
     if (NULL==image) return 1; 
      for (a=0;a<width;a++) { 
       image[a]=(WORD*)calloc(height,sizeof(WORD)); 
       if (NULL==image[a]){ 
        printf("free image\n"); 
        free(image); 
        return 2;} 
      } 

Ich verwendete Calloc-Funktion, von dieser Funktion ist es, Speicher zuzuordnen und zu initialisieren.

0
image[0] = (unsigned char *)malloc(sizeof(unsigned char) * width * height); 

Sie ordnen nur Platz für ein Array anstelle einer ganzen Lookup-Tabelle, in der alle Zeiger zeigt auf einem zugeordneten Array.

Aber es ist absolut nicht notwendig, eine obskure Lookup-Tabelle hier an erster Stelle zu verwenden. Verwenden Sie stattdessen einen 2D-Array:

width = ...; 
height = ....; 
unsigned char (*image)[][height]; 
image = malloc(sizeof(unsigned char[width][height])); 

... 

free(image); 

Und jetzt, da Sie ein echtes 2D-Array anstatt einig fragmentierte Sache haben, können Sie das gesamte Array auf einmal lesen, wenn Sie wollen:

fread(image, sizeof(unsigned[width][height]), 1, fp); 

Bedeutung : In mein 2D-Array, lesen Sie ein 2D-Array von fp. Sie können die Schleife überspringen.

+0

Ich habe diese Art und Weise auf Visual Studio verwendet, und habe dies: IntelliSense: Ausdruck muss ein Zeiger auf den vollständigen Objekttyp zeigen –

+0

@MichaelZhan Sie müssen einen modernen Standard-C-Compiler verwenden, um dies zu kompilieren. Der Visual Studio "2015" -Compiler ist völlig überholter Mist, er enthält Jahr-1989-Technologie gemischt mit etwas Technologie des Jahres 1999. – Lundin

+0

HAHA.Finally habe ich Calloc-Funktion verwendet.Und eigentlich mag ich Xcode, um den Code zu schreiben. –