任何可以在bitmapdata中解释步幅的功能吗?

Bad*_*adr 7 c#

        Bitmap bit1 = new Bitmap( bmpimg , width , height );
        Bitmap bit2 = new Bitmap( bmp , width , height );

        Bitmap bmpresult = new Bitmap( width , height );

        BitmapData data1 = bit1.LockBits( new Rectangle( 0 , 0 , bit1.Width , bit1.Height ) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb );
        BitmapData data2 = bit2.LockBits( new Rectangle( 0 , 0 , bit2.Width , bit2.Height ) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb );
        BitmapData data3 = bmpresult.LockBits( new Rectangle( 0 , 0 , bmpresult.Width , bmpresult.Height ) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb );

unsafe
        {
            int remain1 = data1.Stride - data1.Width * 3;
            int remain2 = data2.Stride - data2.Width * 3;
            int remain3 = data3.Stride - data3.Width * 3;


            byte* ptr1 = ( byte* )data1.Scan0;
            byte* ptr2 = ( byte* )data2.Scan0;
            byte* ptr3 = ( byte* )data3.Scan0;

            for( int i = 0 ; i < height ; i ++ )
            {
                for( int j = 0 ; j < width * 3 ; j ++ )
                {
                    ptr3[ 0 ] = ( byte ) ( XOR_Operator( ptr1[ 0 ] , ptr2[ 0 ] ) );
                    ptr1 ++;
                    ptr2 ++;
                    ptr3 ++;
                }

                ptr1 += remain1;
                ptr2 += remain2;
                ptr3 += remain3;
            }


        }

        bit1.UnlockBits( data1 );
        bit2.UnlockBits( data2 );
        bmpresult.UnlockBits( data3 );

        return bmpresult;
    }
Run Code Online (Sandbox Code Playgroud)

是否有必要保留数据对象

Fra*_*ger 7

由于硬件要求不幸泄漏到API层,Stride就在那里.

这很重要,因为Windows驱动程序有时需要扫描线(图像中的行)与内存对齐.这就是为什么它们有时比它们严格需要的要大.

例如,请参阅此MSDN文章DIB及其使用.

每条扫描线都是DWORD对齐的.扫描线被缓冲到对齐; 缓冲不一定是0.

你的处理似乎就足够了.


Dre*_*ann 5

Stride是您的代码必须迭代以到达下一个垂直像素的字节数.

如果硬件需要特定倍数的宽度,则这可能与图像的宽度*像素大小不同.