3

メモリ内のビットマップにコントラストと明るさを適用しようとしていますが、完全に失われています。現在、Magick ++を使用してそれを実行しようとしていますが、他のAPIのいずれかがより適切に機能する場合は、私はすべての耳です。コントラストを適用するためのMagick::Image :: sigmoidalContrast()を見つけることができましたが、それを機能させる方法がわかりません。画像を作成し、バッファポインターを渡してからその関数を呼び出していますが、何も変更されていないようです。最初は、コピーを作成して変更することでした。それでも、Magick::Imageオブジェクトからデータを取得する方法がわかりません。

これが私がこれまでに得たものです。

Magick::Image image(fBitmapData->mGetTextureWidth(), fBitmapData->mGetTextureHeight(), "RGBA", MagickCore::CharPixel, pixels);
image.sigmoidalContrast(1, 20.0);

ドキュメントは役に立たず、検索した後、最初のパラメータが実際にはブール値であるというヒントしか見つかりませんでした。サイズは、コントラストを加算するか減算するかを指定するsize_tを取りますが、2番目の値は何をすべきかわかりません。合格したので、テストに20.0を使用しています。

それで、これがコントラストのために働くかどうか誰かが知っていますか、そうでない場合、あなたはどのようにコントラストを適用しますか?同様に、私はまだ明るさを適用する方法がわからず、それらが機能するように見える機能を見つけることができません。

4

2 に答える 2

5

理解した; 使っていたコントラストの関数は正しく、明るさの関数は を使用することになりましたimage.modulate(brightness, 100.0, 100.0);。画像オブジェクトからデータを取得するには、次のようにして画像全体のピクセルを取得できます

const MagickCore::PixelPacket * magickPixels = image.getConstPixels(0, 0, image.columns(), image.rows());

次に、イメージ コンストラクターに渡されたmagickPixelsデータを元のデータにコピーします。pixels注意すべき重要なことは、そのメンバーMagickCore::PixelPacket::opacityはあなたが思っているようなものではないということです。ピクセルが完全に透明な場合、値は 0 になると思いますよね? なんらかの理由で、ImageMagick は逆のことを行っています。255 - opacityしたがって、完全な透明度の場合、値は 255 になります。これは、正しい値を取得する必要があることを意味します。

MAGICKCORE_QUANTUM_DEPTHまた、ImageMagick がコンパイルされた にも注意してください。これにより、値が大幅に変更されます。私のコードMAGICKCORE_QUANTUM_DEPTHではたまたま 16 と定義されていたため、すべての値は 0 から 65535 の範囲でした。これrealValue = magickValue >> 8は、テクスチャ データがunsigned char値であるため、データをコピーして戻すときに修正しました。

これらの関数の使用方法を明確にするために、ドキュメンテーションは恐ろしく、完全に間違っているsignmoidalContrast()ため、型が size_t であっても、最初のパラメータは実際にはブール値であり、コントラストを上げる (true) か下げるかを指定します ( false)、2 番目は 0.00001 から 20.0 の範囲です。0.0 は無効な値であるため、0.00001 と言います。0.0 に近いが正確ではない 10 進数である必要があります。

ドキュメントには、変更なしの場合modulate()は各値を 1.0 として指定する必要があると記載されていますが、これは完全に間違っています。値は実際にはパーセンテージであるため、変更がない場合は 100.0 を指定します。

このことを理解するのに一日中かかったので、それが誰かの助けになることを願っています.

于 2012-06-12T02:00:58.843 に答える
1

Imagemagick の Web サイトによると、コマンド ライン用ですが、同じかもしれません。

-sigmoidal-contrast コントラスト x 中点

ハイライトやシャドウを飽和させずにコントラストを上げます。

ハイライトやシャドウを飽和させずに、シグモイド伝達関数を使用してイメージのコントラストを上げます。コントラストは、コントラストをどの程度上げるかを示します。たとえば、0 に近い場合はなし、3 は一般的、20 は多いです。正確に 0 は無効ですが、0.0001 はコントラストの変化がない場合とほとんど変わらないことに注意してください。mid-point は、結果のイメージでミッドトーンがどこにあるかを示します (0 は白、50% は中間グレー、100% は黒)。デフォルトでは、画像のコントラストが上がります。+sigmoidal-contrast を使用してコントラストを下げます。

シグモイドの明るさの変化に相当するものを実現するには、-sigmoidal-contrast brightx0% を使用して明るさを増やし、class="arg">+sigmoidal-contrast brightx0% を使用して明るさを減らします。

コマンド ラインには、新しいバージョンの magic++ にある可能性のある新しい明るさのコントラスト設定がありますか?

-brightness-contrast 明るさ{xcontrast}{%}}

画像の明るさやコントラストを調整します。

明るさとコントラストの値は、入力画像に変更を適用します。絶対的な設定ではありません。明るさまたはコントラストの値が 0 の場合は、変化がないことを意味します。値の範囲はそれぞれ -100 から +100 です。正の値は明るさまたはコントラストを増加させ、負の値は明るさまたはコントラストを減少させます。コントラストのみを制御するには、明るさ = 0 に設定します。明るさだけを制御するには、contrast=0 に設定するか、オフのままにします。

-channel を使用して、輝度やコントラストの変更を適用するチャンネルを制御することもできます。デフォルトでは、すべてのチャネルに同じ変換が適用されます。

明るさとコントラストの引数は、線形変換のオフセットと勾配に変換され、関数多項式「勾配、オフセット」を使用して適用されます。

勾配は、contrast=-100 で 0 から、contrast=+100 でほぼ垂直に変化します。明るさ = 0、コントラスト = -100 の場合、結果は完全にミッドグレーになります。明るさ = 0 でコントラスト = +100 の場合、結果は中間グレーのしきい値に近づきますが、完全には到達しません。つまり、線形変換は中間グレーで非常に急な垂直線です。

この関数では、負の勾配、つまりイメージを否定することはできません。達成可能な勾配はすべてゼロまたは正です。

オフセットは、brightness=-100 での -0.5 から、brightness=0 での 0 まで、brightness=+100 での +0.5 まで変化します。したがって、contrast=0、brightness=100 の場合、結果は完全に白になります。同様に、contrast=0、brightness=-100 の場合、結果は真っ黒になります。

引数の値の範囲は -100 から +100 であるため、「%」記号を追加しても、そのままにしておくのと同じです。

magick++ が Imagick のようなものである場合、Imagemagick オプションよりもはるかに遅れている可能性があります。

于 2012-06-11T14:49:00.827 に答える