6

画像マスクを取得して別の画像に適用するメソッドを作成しました。この投稿を見ると、フレーム画像が表示されます。その投稿のフレーム画像はでmaskingImage、背景画像はimageToMaskです。マスキング画像は、実際には中央がホットピンクの画像です。これは、メソッドが通過するプロセスです。

  1. マスキング画像はPNGで、マスキングする画像はJPGです。
  2. このメソッドは、マスキングイメージをトレースし、イメージを描画してその上にマスキングします。これにより、外側の透明度を維持できます。
  3. マスキング画像の下に描画される出力フォームで、ホットピンクの色を透明にします。

この行var bitsimageToMask = imageToMask.LockBits...は、エラーが発生する場所です。マスクする画像の幅または高さがマスキング画像よりも小さい場合、「パラメータが無効です」というエラーが発生します。ビットマップの操作に関しては、私は初心者です。

public Bitmap RenderMaskedImage(Bitmap maksingImage, Bitmap imageToMask, Point imageToMaskOffset, ImageFormat imageFormat)
{
    using (var newImageToMaskGraphic = Graphics.FromImage(imageToMask))
    {
    newImageToMaskGraphic.DrawImage(imageToMask, imageToMaskOffset);
    }

    var output = new Bitmap(maksingImage.Width, maksingImage.Height, PixelFormat.Format32bppArgb);
    var rect = new Rectangle(0, 0, maksingImage.Width, maksingImage.Height);
    var bitsMask = maksingImage.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
    var bitsimageToMask = imageToMask.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
    var bitsOutput = output.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

    unsafe
    {
        for (int y = 0; y < maksingImage.Height; y++)
        {
            var ptrMask = (byte*)bitsMask.Scan0 + y * bitsMask.Stride;
            var ptrimageToMask = (byte*)bitsimageToMask.Scan0 + y * bitsimageToMask.Stride;
            var ptrOutput = (byte*)bitsOutput.Scan0 + y * bitsOutput.Stride;
            for (int x = 0; x < maksingImage.Width; x++)
            {
                ptrOutput[4 * x] = ptrimageToMask[4 * x];           // blue
                ptrOutput[4 * x + 1] = ptrimageToMask[4 * x + 1];   // green
                ptrOutput[4 * x + 2] = ptrimageToMask[4 * x + 2];   // red
                ptrOutput[4 * x + 3] = ptrMask[4 * x + 3];        // alpha 
            }
        }
    }

    maksingImage.UnlockBits(bitsMask);
    imageToMask.UnlockBits(bitsimageToMask);
    output.UnlockBits(bitsOutput);

    using (var outputGraphic = Graphics.FromImage(output))
    {
        outputGraphic.DrawImage(maksingImage.ToTransparentColor(255,0,192), 0, 0);
    }

    return output;
}
4

1 に答える 1

7

その理由は、imageToMask で使用している rect がビットマップ自体よりも大きいためです。

var rect = new Rectangle(0, 0, maksingImage.Width, maksingImage.Height);
var bitsimageToMask = imageToMask.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

四角形は、ロックする必要があるビットマップの領域を指定するために使用されます。この四角形は、ビットマップと同じサイズまたはそれより小さいサイズにすることができますが、それより大きくすることはできません。あなたの場合、 maskingImage に基づいて四角形を使用しているため、四角形は使用しているビットマップよりも大きくなり、そのエラーが発生します。

于 2012-12-14T19:00:21.123 に答える