0

私は画像ファイルを読み取って、各バイトにそのピクセルレベルを絶対係数でスケーリングすることによってスケーリングしようとしています。私はそれを正しくやっているかどうかはわかりませんが-

void scale_file(char *infile, char *outfile, float scale)
{
    // open files for reading
    FILE *infile_p = fopen(infile, 'r');
    FILE *outfile_p = fopen(outfile, 'w');

    // init data holders
    char *data;
    char *scaled_data;

    // read each byte, scale and write back
    while ( fread(&data, 1, 1, infile_p) != EOF )
    {
        *scaled_data = (*data) * scale;
        fwrite(&scaled_data, 1, 1, outfile);
    }

    // close files
    fclose(infile_p);
    fclose(outfile_p);
}

私が得たのは、各バイトの乗算を行う方法です(スケールは0〜1.0フロートです)-私はそれを間違って読んでいるか、何か大きなものを見逃していると確信しています。また、データは符号なし(0〜255)であると見なされます。私の貧弱なコードを判断しないでください:)

ありがとう

4

5 に答える 5

3
char *data;
char *scaled_data;

これらのポインタにはメモリが割り当てられていません-なぜポインタとして必要なのですか?unsigned char変数は問題ありません(unsignedバイトデータの方が理にかなっているため)。

また、スケールが256の範囲から値を発射するとどうなりますか?飽和、ラッピング、または何が必要ですか?

于 2010-03-06T15:46:13.727 に答える
2
  1. char *scaled_data;に変更char scaled_data;
  2. *scaled_data = (*data) * scale;に変更scaled_data = (*data) * scale;

それはあなたがやろうとしていることをするコードをあなたに与えるでしょう、しかし...。

これは、独自のカスタム形式の画像ファイルでのみ機能する可能性があります。ファイル内のピクセルをバイト単位で順番にダンプするだけの標準的な画像形式はありません。画像ファイルは、次のような詳細情報を知る必要があります

  1. 画像の高さと幅
  2. ピクセルの表現方法(1バイトのグレー、3バイトのカラーなど)
  3. ピクセルがパレットへのインデックスとして表される場合、それらにはパレットがあります
  4. その他のあらゆる情報(GPS座標、それを作成したソフトウェア、作成日など)
  5. ピクセルに使用される圧縮方法

これらはすべてメタデータと呼ばれます

さらに(#5でほのめかされているように)、ピクセルデータは通常圧縮されています。

于 2010-03-07T02:34:38.903 に答える
2

あなたのコードは、「ビットを半分に分割して画像を縮小したい」と言っているのと同じです。意味がありません。

画像ファイルは、ヘッダーとフィールド、および解釈する必要のあるあらゆる種類の楽しいものを含む複雑な形式です。nobugzのアドバイスを受けて、 ImageMagickをチェックしてください。それはまさにあなたが望むようなことをするためのライブラリです。

于 2010-03-07T02:59:53.117 に答える
1

なぜあなたが間違っていると思うのか、私はあなたのアルゴリズムに効率的でないことを除いて何も悪いことは見ていchar *data;ませchar *scaled_data;unsigned char data;unsigned char scaled_data;

于 2010-03-06T16:05:27.830 に答える
1

ビットマップ(生データのみ)についての私の理解は、各pixleはRGB用にそれぞれ1つずつ3つの数字で表されるということです。それぞれに<=1の数値を掛けると、画像が暗くなります。画像を広くしようとしている場合は、各ピクセルを2回出力する(サイズを2倍にする)か、1ピクセルおきに出力する(サイズを半分にする)ことができますが、それはラスタライズ方法によって異なります。

于 2010-03-06T19:31:10.097 に答える