2010-11-28 16 views

答えて

3

これは、カラーマップでは実行できません。 colormatrixはある色から別の色への線形変換に適しています。あなたが必要とするのは線形ではありません。

+0

彼は、2つを使用できます。 –

+0

@ハンス:あなたは詳しく教えてもらえますか? – Pedery

+0

これはJanの答えでした。私は彼がボールを拾うことを望んでいた。これがあなたを助けなかったかどうかあなた自身の質問をしてください。 –

1

これらの比較的単純な画像操作を行う良い方法は、ビットマップデータを自分で直接取得することです。 Bob Powellはこの記事をhttp://www.bobpowell.net/lockingbits.htmに書いています。 Marshalクラスを使用してビットマップをロックし、そのデータにアクセスする方法について説明します。

また、この記事にも少し書いてあります。最大の違いは、画像データをint配列にコピーすることで、これは少し簡単になります。 http://ilab.ahemm.org/tutBitmap.html

これは、これらの線に沿って構造体を持って良いことだ:

[StructLayout(LayoutKind.Explicit)] 
public struct Pixel 
{ 
    // These fields provide access to the individual 
    // components (A, R, G, and B), or the data as 
    // a whole in the form of a 32-bit integer 
    // (signed or unsigned). Raw fields are used 
    // instead of properties for performance considerations. 
    [FieldOffset(0)] 
    public int Int32; 
    [FieldOffset(0)] 
    public uint UInt32; 
    [FieldOffset(0)] 
    public byte Blue; 
    [FieldOffset(1)] 
    public byte Green; 
    [FieldOffset(2)] 
    public byte Red; 
    [FieldOffset(3)] 
    public byte Alpha; 


    // Converts this object to/from a System.Drawing.Color object. 
    public Color Color { 
     get { 
      return Color.FromArgb(Int32); 
     } 
     set { 
      Int32 = Color.ToArgb(); 
     } 
    } 
} 

ただ、新しいピクセルオブジェクトを作成し、あなたがたInt32フィールドを経由してそのデータを設定し、各色成分を変更/リードバックすることができます。

Pixel p = new Pixel(); 
p.Int32 = pixelData[pixelIndex]; // index = x + y * stride 
if(p.Red < 165) { 
    p.Int32 = 0; // Reset pixel 
    p.Alpha = 255; // Make opaque 
    pixelData[pixelIndex] = p.Int32; 
} 
関連する問題