1

Bitmaps の配列を単一のにマージしようとしていBitmapます。Bitmap[,]次のような配列が与えられたb場合 (これらは文字のように見える画像であると仮定します):

b[0,0] = 1
b[1,0] = 2
b[0,1] = 3
b[1,1] = 4

生成したい

result = 12
         34

たとえば、次の 4 つBitmapの sがあるとします。

b[0,0] =画像 0,0;

b[1,0] =画像 1,1;

b[0,1] =画像 0,1;

b[1,1] =画像 1,1;

生成したい result =結果;

これまでの私のコードは次のとおりです。

    public static Bitmap Moisac(ref Bitmap[,] b)
    {
        BitmapData[,] bmData = new BitmapData[b.GetUpperBound(0) + 1, b.GetUpperBound(1) + 1];
        IntPtr[,] scan0 = new IntPtr[b.GetUpperBound(0) + 1, b.GetUpperBound(1) + 1];
        unsafe
        {
            byte*[,] p = new byte*[b.GetUpperBound(0) + 1,b.GetUpperBound(1) + 1];
            for (int i = 0; i <= b.GetUpperBound(0); i++)
                for (int j = 0; j <= b.GetUpperBound(1); j++)
                    if (b[i, j].Width != b[0, 0].Width | b[i, j].Height != b[0, 0].Height)
                        throw new ArgumentException(
                            "Width and Height properties of all elements of b must be equal.",
                            "b");

            int oneW = b[0, 0].Width;
            int oneH = b[0, 0].Height;
            int overallWidth = oneW * (b.GetUpperBound(0) + 1);
            int overallHeight = oneH * (b.GetUpperBound(1) + 1);
            Bitmap result = new Bitmap(b[0, 0], overallWidth, overallHeight);

            for (int i = 0; i <= b.GetUpperBound(0); i++)
                for (int j = 0; j <= b.GetUpperBound(1); j++)
                {
                    bmData[i, j] = b[i, j].LockBits(new Rectangle(0, 0, oneW, oneH),
                                                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                    scan0[i, j] = bmData[i, j].Scan0;
                    p[i, j] = (byte*)(void*)scan0[i, j];
                }

            BitmapData rbmData = result.LockBits(new Rectangle(0, 0, overallWidth, overallHeight),
                                                 ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            int stride = bmData[0, 0].Stride;
            int nOffset = stride - 3*b[0, 0].Width;

            int rStride = rbmData.Stride;
            IntPtr rScan0 = rbmData.Scan0;
            byte* rp = (byte*) (void*) rScan0;

            for (int imgY = 0; imgY < b.GetUpperBound(1); ++imgY)
            {
                for (int imgX = 0; imgX <= b.GetUpperBound(0); ++imgX)
                {
                    byte* currp = p[imgX, imgY];
                    for (int y = 0; y < oneH; ++y)
                    {
                        for (int x = 0; x < 3*oneW; ++x)
                        {
                            rp[rStride*(imgY*oneH + y) + 3*imgX*oneW + x] = currp[0];
                            ++currp;
                        }
                        currp += nOffset;
                    }
                }
            }

            for (int i = 0; i <= b.GetUpperBound(0); i++)
                for (int j = 0; j <= b.GetUpperBound(1); j++)
                    b[i, j].UnlockBits(bmData[i,j]);


            result.UnlockBits(rbmData);
            return result;
        }
    }

アルバムの画像はこちらでご覧ください。それらのすべてがここに表示されるわけではありません。

4

2 に答える 2

1

私はこれまでで最も愚かな間違いを犯しました。ただし、それが誰かを助ける可能性がある場合は、変更してください

for (int imgY = 0; imgY < b.GetUpperBound(1); ++imgY)

for (int imgY = 0; imgY <= b.GetUpperBound(1); ++imgY)

( は である<必要があります<=)。

于 2012-11-06T10:35:09.907 に答える