快速图片合并(BitmapData操作)

        public static Bitmap Merge(Bitmap left, Bitmap right)
        {
            Bitmap bmpOut = new Bitmap(left.Width + right.Width, left.Height);
            unsafe
            {
                BitmapData leftData = left.LockBits(new Rectangle(0, 0, left.Width, left.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                byte* leftPtr = (byte*)(void*)leftData.Scan0;

                BitmapData rightData = right.LockBits(new Rectangle(0, 0, right.Width, left.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                byte* rightPtr = (byte*)(void*)rightData.Scan0;

                BitmapData outData = bmpOut.LockBits(new Rectangle(0, 0, bmpOut.Width, bmpOut.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                byte* outPtr = (byte*)(void*)outData.Scan0;

                int outStride = outData.Stride;
                int offL = leftData.Stride - 3 * left.Width;
                int offR = rightData.Stride - 3 * right.Width;
                for (int y = 0; y < left.Height; ++y)
                {
                    for (int x = 0; x < leftData.Width * 3; ++x)
                    {
                        outPtr[outStride * y + x] = leftPtr[0];
                        ++leftPtr;
                    }
                    leftPtr += offL;

                    for (int x = 0; x < rightData.Width * 3; ++x)
                    {
                        outPtr[outStride * y + 3 * left.Width + x] = rightPtr[0];
                        ++rightPtr;
                    }
                    rightPtr += offR;
                }

                left.UnlockBits(leftData);
                right.UnlockBits(rightData);
                bmpOut.UnlockBits(outData);
                return bmpOut;
            }
        }
        public static Bitmap Merge(Bitmap[] bitmaps)
        {
            int count = bitmaps.Length;
            int height = bitmaps[0].Height;
            int outWidth = bitmaps.Select(b => b.Width).Sum();
            Bitmap bmpOut = new Bitmap(outWidth, bitmaps[0].Height);
            unsafe
            {
                BitmapData[] imgData = new BitmapData[count];
                byte*[] imgPtr = new byte*[count];
                int[] imgOffset = new int[count];
                int[] imgStart = new int[count];
                imgStart[0] = 0;
                for (int i = 0; i < count; i++)
                {
                    imgData[i] = bitmaps[i].LockBits(new Rectangle(0, 0, bitmaps[i].Width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                    imgPtr[i] = (byte*)imgData[i].Scan0;
                    imgOffset[i] = imgData[i].Stride - 3 * bitmaps[i].Width;
                    if (i > 0) imgStart[i] = imgStart[i - 1] + imgData[i - 1].Width * 3;
                }

                BitmapData outData = bmpOut.LockBits(new Rectangle(0, 0, bmpOut.Width, bmpOut.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                byte* outPtr = (byte*)(void*)outData.Scan0;
                int outStride = outData.Stride;

                for (int y = 0; y < height; ++y)
                {
                    for (int idx = 0; idx < count; idx++)
                    {
                        for (int x = 0; x < imgData[idx].Width * 3; ++x)
                        {
                            outPtr[outStride * y + imgStart[idx] + x] = imgPtr[idx][0];
                            ++imgPtr[idx];
                        }
                        imgPtr[idx] += imgOffset[idx];
                    }
                }
                for (int i = 0; i < count; i++)
                {
                    bitmaps[i].UnlockBits(imgData[i]);
                }
                bmpOut.UnlockBits(outData);
                return bmpOut;
            }
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值