1

PPM を P6 (バイナリ) から P3 (ASCII) に変換するコンバーターに取り組んでいます。PPM は未加工の形式であるため、品質の低下は発生しないと考えていましたが、説明のつかない理由により、変換時に次のことが発生します。

元の画像: PP6

変換後の画像: PP3

これは私が仕事のために書いたアルゴリズムです:

int convertP6toP3(char* fileName)
{
    FILE *src, *dest;
    char *outputFilename;
    char magicNumber[3];
    int height, width, depth;
    unsigned char red, green, blue;
    int i, j, widthCounter = 1;

    if (checkFileExists(fileName) == FALSE)
    {
        printf("- Given file does not exists!\n");
        return ERROR;
    }

    else
        src = fopen(fileName, "rb");

    // create output filename #MUST FREE ALLOCATED MEMORY#
    outputFilename = getOutputFilename(fileName, ".p3.ppm");
    // REMOVE + AFTER TESTING
    dest = fopen(outputFilename, "w+");

    // check that the input file is actually in P6 format
    fscanf(src, "%s", magicNumber);
    if (strcmp(magicNumber, "P6") != 0)
        return ERROR;
    fscanf(src, "\n%d %d\n%d\n", &width, &height, &depth);

    fprintf(dest, "P3\n");
    fprintf(dest, "#P3 converted from P6\n");
    fprintf(dest, "%d %d\n%d\n", width, height, depth);;
    for (i = 0; i < width*height; i++)
    {

        for (j = 0;  j < 3; j++)
        {
            fread(&red, 1, 1, src);
            fread(&green, 1, 1, src);
            fread(&blue, 1, 1, src);
        }

        for (j = 0;  j < 3; j++)
            fprintf(dest, "%d %d %d ", red, green, blue);

        if (widthCounter == width)
        {
            fprintf(dest, "\n");
            widthCounter = 1;
        }

        else
            widthCounter++;
    }

    free(outputFilename);
    fclose(src);
    fclose(dest);
    return TRUE;
}

この品質低下が発生するのはなぜですか?

編集: GIMP 変換の出力ファイルをメモ帳で開いているときに、コンバーターには GIMP の 3 倍のサンプル (赤、緑または青の値) があることがわかりました。

4

2 に答える 2

4

@クエーカーはそれのほとんどを持っています

「両方の for (j = 0; j < 3; j++) ループが問題の原因です。各ピクセルを 3 回印刷するため、画像がエラーになります。」

これは、品質の損失を説明しています。3 ピクセルが誤って読み取られる

for (j = 0;  j < 3; j++) { fread(&red, 1, 1, src); ...

最初の 2 ピクセルの値は破棄されます。3 番目のピクセルは 3 回書き込まれます。

for (j = 0;  j < 3; j++) fprintf(dest, "%d %d %d ", red, green, blue);

サイズの問題「画像エラー」は別の可能性があります。提供された写真 (元は jpeg) と結果の写真 (透過性 (アルファ チャネル) を持つ png) は、コードの ".ppm" ではありません。おそらくサイズの問題は、元の .ppm ファイルが .jpg として保存され、結果の .ppm ファイルが .png として保存されたことです。損失の多い形式である .jpg は、一部のデータを単純に取り出し、すべてを保持する .png ファイルよりも小さいファイルを作成することができました。

于 2013-08-20T20:39:10.987 に答える