1

コード内およびオンデマンドで、32 ビット RGBA Image オブジェクト (元は 32 ビット PNG) を対応する 32 ビット グレースケールに変換したいと考えています。

ここで他のいくつかの質問と、オンラインの多くの記事を既に読みました。ColorMatrix を使用して試してみましたが、アルファをうまく処理していないようです。完全に不透明なグレースケールのピクセル。部分的に透明なピクセルは、それらのピクセルにまだ色の色合いがあるため、うまく変換されないように見えます。目立つだけで十分です。

私が使用する ColorMatrix は次のとおりです。

new System.Drawing.Imaging.ColorMatrix(new float[][]{
                    new float[] {0.299f, 0.299f, 0.299f, 0, 0},
                    new float[] {0.587f, 0.587f, 0.587f, 0, 0},
                    new float[] {0.114f, 0.114f, 0.114f, 0, 0},
                    new float[] {     0,      0,      0, 1, 0},
                    new float[] {     0,      0,      0, 0, 1}
                    });

私が読んだように、これはかなり標準的な NTSC 加重マトリックスです。次に、 とともに使用しますGraphics.DrawImageが、前述のように、部分的に透明なピクセルにはまだ色が付けられています。PictureBoxこれは、白い背景にWinForms を介して Image オブジェクトを表示していることに注意してください。おそらく、PictureBox が画像を描画し、透明な部分を処理する方法でしょうか? 背景色は影響していませんが (色の色合いは確かに元の画像からのものです)、おそらく PictureBox は透明なピクセルを正しく再描画していませんか?

OpacityMask と共に FormatConvertedBitmap を使用するメソッドをいくつか見てきました。主に、PresentationCore.dll をインポートする必要がないことを本当に望んでいるためです (言うまでもなく、.NET 2.0 限定アプリでは機能しません)。確かに、基本的な System.Drawing.* のものは、この簡単な手順を実行できますか? か否か?

4

3 に答える 3

5

ColorMatrix を使用してイメージをペイントしていますか? もちろん、それは機能しません (緑のピクセルの上に半透明の灰色をペイントすると、一部の緑が透けて見えるため)。透明なピクセルのみを含む新しい空のビットマップにペイントする必要があります。

于 2010-06-16T14:22:36.020 に答える
4

danbystromの怠惰な好奇心のおかげで、私は確かにオリジナルの上に描き直していました。興味のある方のために、私が使用した修正された方法を次に示します。

using System.Drawing;
using System.Drawing.Imaging;

public Image ConvertToGrayscale(Image image)
{
    Image grayscaleImage = new Bitmap(image.Width, image.Height, image.PixelFormat);

    // Create the ImageAttributes object and apply the ColorMatrix
    ImageAttributes attributes = new System.Drawing.Imaging.ImageAttributes();
    ColorMatrix grayscaleMatrix = new ColorMatrix(new float[][]{
        new float[] {0.299f, 0.299f, 0.299f, 0, 0},
        new float[] {0.587f, 0.587f, 0.587f, 0, 0},
        new float[] {0.114f, 0.114f, 0.114f, 0, 0},
        new float[] {     0,      0,      0, 1, 0},
        new float[] {     0,      0,      0, 0, 1}
        });
    attributes.SetColorMatrix(grayscaleMatrix);

    // Use a new Graphics object from the new image.
    using (Graphics g = Graphics.FromImage(grayscaleImage))
    {
        // Draw the original image using the ImageAttributes created above.
        g.DrawImage(image,
                    new Rectangle(0, 0, grayscaleImage.Width, grayscaleImage.Height),
                    0, 0, grayscaleImage.Width, grayscaleImage.Height,
                    GraphicsUnit.Pixel,
                    attributes);
    }

    return grayscaleImage;
}
于 2010-06-16T14:46:08.767 に答える
0

画像を TGA (圧縮されていない imaeg 形式) に変換する場合は、"RubyPixels" を使用してピクセル データを直接編集することができます。その後、PNG に戻すことができます。

RubyからもImageMagickで変換することをお勧めします。

于 2010-06-16T14:00:34.010 に答える