1

色付きのBMPファイルをグレースケールのBMPに変換しようとしています。入力bmpは24ビットで、出力で同じ24ビットbmpを生成していますが、今回はグレースケールのみです。

私が使用しているコードは

for(int x = 0; x < max; x++)
{
    int lum;
    lum = (r[x]*0.30) + (g[x]*0.59) + (b[x]*0.11);
    r[x] = lum;
    g[x] = lum;
    b[x] = lum;
}

、、配列はRGBカラーコンポーネントであり、私はそれらをに持っていrます。gbchar *r,*g,*b

いくつかの理由で、きれいな出力が得られません。私はこの質問で得た出力を添付しています。そのパッチはパッチであり、ペースに白と黒の領域が含まれています。それで、私はここで何を間違っているのですか?

  1. lumの計算でデータが失われたためですか、それともintをcharとして格納する際に何か問題がありますか?
  2. グレースケールbmpを24ビットにすることはできませんか?または、変換後にrgb値を保存する方法に問題がありますか?

これに関するどんな助けも大いに適用されるでしょう。ありがとう。

4

2 に答える 2

6

これらは本当にあるべきunsigned charです; プラットフォームで署名されている場合char、このコードは期待どおりに機能しません。

于 2010-11-10T18:20:32.963 に答える
2

計算の出力を[0,255]にクランプする必要があります。計算は問題ないように見えますが、必ず確認することをお勧めします。

また、r、g、b配列が。であることを確認してunsigned charください。intでの多くの符号付き/符号なしの混合(2の補数のオーバーフローが間違いをカバーしているため)で逃げることができますが、floatに変換するときは、符号が正しくなければなりません。

于 2010-11-10T18:20:33.930 に答える