1

*.bmp ファイルを単純に読み書き (コピー) するコードを書きました。しかし、私のプログラムが何度も何度も実行されるのは何かが間違っています...内部にwhile(true)ループがあるように見えます。私のコードは次のとおりです。

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

#pragma pack(push, 1)
typedef struct Pix
{
  unsigned char R;
  unsigned char G;
  unsigned char B;
  unsigned char L;
  int BW;
}Pix;
#pragma pack(pop)

#pragma pack(push, 1)
typedef struct BitMap
{
    short Signature;
    long Reserved1;
    long Reserved2;
    long DataOffSet;

    long Size;
    long Width;
    long Height;
    short Planes;
    short BitsPerPixel;
    long Compression;
    long SizeImage;
    long XPixelsPreMeter;
    long YPixelsPreMeter;
    long ColorsUsed;
    long ColorsImportant;
    struct Pix *pixels
}BitMap;
#pragma pack(pop)

int main(int argc, char **argv)
{

unsigned long int i=0;//to count pixels readed
unsigned long int S=0;//number of pixcels to read

struct BitMap source_info;//to store bitmap info header
struct Pix source_pix;// to store pixcels

FILE *fp;//file pointer for source file
FILE *Dfp;//file ponter for distenation file

if(!(fp=fopen("in.bmp","rb")))//open in binery read mode
{
printf(" can not open file");//prind and exit if file open error
exit(-1);
}


Dfp=fopen("out.bmp","wb");//opne in binery write mode
//read the headers to souirce file
fread(&source_info, (sizeof(long)*3 + sizeof(short)),1,fp);

//calucate the number of pix to read
S=source_info.Width*source_info.Height;
source_info.pixels =  (struct Pix *) malloc(sizeof(struct Pix)*S);

//read pixcels
for(i=1;i<=S;i++)
{
//read pixcel form source file
fread(&source_pix,sizeof(struct Pix),1,fp);
source_info.pixels[i-1] = source_pix;
}

// write header to dest file
fwrite(&source_info,  (sizeof(long)*3 + sizeof(short)),1,Dfp);
// write pixels to dest file
for(i=1;i<=S;i++)
{
    fwrite(&source_info.pixels[i-1],sizeof(struct Pix),1,Dfp);
}

//close all fiels
fclose(fp);
fclose(Dfp);
return 0;
}
4

3 に答える 3

3

読み取ったピクセル数 (S) は、試したサンプル画像で 3762821376 です。それは明らかに大きすぎる。

struct BitMap使用している が正しいかどうか、BMP 仕様を確認してください。

編集1

これらを変更します。

fread(&source_info, (sizeof(long)*3 + sizeof(short)),1,fp);
...
fwrite(&source_info,  (sizeof(long)*3 + sizeof(short)),1,Dfp);

fread(&source_info, sizeof(source_info),1,fp);
...
fwrite(&source_info, sizeof(source_info),1,Dfp);

これで、テスト用の .bmp が正常にコピーされます。

編集2:

あなたのマシンの色切り替えの問題は、あなたがそうしているためだと思いますsource_info.pixels = ...。独自のポインターPix* pixels = malloc...を使用し、ループ内で に変更source_info.pixelsする必要がありますpixels。malloc を source_info 構造体に割り当てないでください。問題ないはずです

于 2013-02-22T11:25:21.293 に答える
1

ファイルのヘッダーデータを取得すると、最初のデータの後で停止するため、初期化されていないデータにアクセスしていsource_info.Widthます。source_info.Heightfread4 fields

したがって、source_infoの他のフィールドにはジャンクデータが含まれている可能性があります。(特に、次のループに影響を与える原因widthとなります)height

変更するヘッダー全体を必ずお読みください

fread(&source_info, (sizeof(long)*3 + sizeof(short)),1,fp);

fread(&source_info, sizeof(BitMap),1,fp);

次に、同じ理由で正しくダンプするようにします。

fwrite(&source_info,  (sizeof(long)*3 + sizeof(short)),1,Dfp);

fwrite(&source_info, sizeof(BitMap),1,Dfp);
于 2013-02-22T11:38:05.757 に答える
0

Pix ポインターのコピーをスキップする必要があります。必要に応じて、単一の構造内で機能します。

fread(&source_info, (sizeof(BitMap) - sizeof(struct Pix*)),1,fp);

ところで、Pix を次のように定義した場合、コードはより小さいファイル サイズを生成します。

typedef struct Pix
{
  unsigned char R;
  unsigned char G;
  unsigned char B;
}Pix;
于 2013-10-09T10:21:45.677 に答える