3

JPEG 画像ファイルを読み取り、そのビットをテキスト ファイルに保存します。ここで、テキスト ファイル内のこれらのビットを使用して、有効な JPEG 画像に変換したいと考えています。バイナリ ファイルを書き込もうとしましたが、イメージ ファイルが取得されません。

私を正しい方向に導いてください。私はこれに数日間頭を悩ませていますが、今のところ運がありません。

JPGファイルを書き込むための私のコードは次のとおりです。

int length;
unsigned char *inData;  
char Buffer[9];
int c = 0, x;
/* file.txt has single bit per line. */
FILE *reader = fopen(file.txt, "r"); 
FILE *writer = fopen("output.JPG","wb");

fseek(reader, 0, SEEK_END);
length=ftell(reader);
fseek(reader, 0, SEEK_SET);

for(x=0; x < length; x++){
    fscanf(reader, "%d", &inData);
    if(c <= 8){       /*  reading 8-bits  */
        Buffer[c] = inData;
    } else {
        fwrite(&Buffer, sizeof(Buffer), 1, writer);
        c = 0;
    }
    c++;
}

fclose(reader);
fclose(writer);

これは、input.JPG を読み取り、そのビットを file.txt に書き込むためのコード スニペットです。

    char *buffer;
int fileLen;
FILE *file = fopen("inputIM.JPG", "rb");

fseek(file, 0, SEEK_END);
fileLen=ftell(file);
fseek(file, 0, SEEK_SET);

buffer=(char *)malloc(fileLen+1);
fread(buffer, fileLen, 1, file);
fclose(file);
convertToBit(&buffer, fileLen);
free(buffer);
}

// convert buffer data to bits and write them to a text file   
convertToBit(void *buffer, int length)
{
int c=0;
int SIZE = length * 8;
unsigned char bits[SIZE + 1];
unsigned char mask = 1;
unsigned char byte ;
int i = 0;
FILE *bitWRT = fopen("file.txt", "w");

for (c=0;c<length;c++)
{
    byte = ((char *)&buffer)[c];

    for(i = 0; i < 8; i++){
        bits[i] = (byte >> i) & mask;
        fprintf(bitWRT, "%d\n", bits[i]);
    }
}
fclose(bitWRT);
}

ありがとう、

-サム

4

2 に答える 2

2

次のように書き直してみてください (非常に素朴でテストされていない実装であることに注意してください)。

FILE* pInput = fopen("file.txt", "r"); 
FILE* pOutput = fopen("output.JPG","wb");

unsigned char index = 0, byte = 0;
char line[32]; // Arbitrary, few characters should be enough
while (fgets(line, sizeof(line), pInput))
{
    if (line[0] == '1')
        byte = (unsigned char)(byte | (1 << index));

    if (++index == 8)
    {
        fwrite(&byte, 1, 1, pOutput);

        index = 0;
        byte = 0;
    }
}

fclose(pInput);
fclose(pOutput);

仮定:入力ファイルのすべての行は、元のファイルの 1ビットです (元のファイルがたとえば 1024 バイトの場合、テキスト ファイルには 1024 * 8 = 8192 行あることを意味します)。行末記号と (場合によっては) エンコーディングが異なるため、ファイルの全長が (少なくとも 2 倍に) 大きくなることに注意してください。

EDIT 書くには、次のようなものを使用できます。

void convertToBit(void* pBuffer, size_t length)
{
    FILE* pOutput = fopen("file.txt", "w");
    for (size_t i=0; i < length; ++i)
    {
        unsigned char byte = (unsigned char)pBuffer[i];
        for (int bitIndex=0; bitIndex < 8; ++bitIndex)
        {
            if ((byte & (1 << bitIndex)) != 0)
                fputs("1\n", pOutput);
            else
                fputs("0\n", pOutput);
        }
    }

    fclose(pOutput);
}
于 2012-05-10T11:25:15.177 に答える
0

考慮しなければならない重要な点が 1 つあります。すべてのファイルには、最初にヘッダーがあり、最後にフッターがあります。jpegヘッダーはFF D8なので、単純にファイルに書き込むとこのヘッダーが壊れてファイルが壊れてしまいます。

もう 1 つの重要なことは、imagem ファイルを読みたい場合、元はキャラクターを読み書きするように設計された関数で内容を読み込もうとする代わりに、fread()/fwrite を使用してバイナリ モードで読み込もうとしたことがありますか? (わかりません。ここでばかげたことを言っているのかもしれませんが、試してみます)

私の下手な英語で申し訳ありません....

于 2015-12-13T01:39:44.037 に答える