【问题标题】:How images can be XOR using C#'s builtin methods?如何使用 C# 的内置方法对图像进行异或?
【发布时间】:2011-01-03 15:41:35
【问题描述】:

如何使用 C# 内置方法或任何其他图像处理技术对带有 BMP 扩展的图像进行异或?

我现在正在这样做,但我想要更有效的方法。

using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace IProcessing
{
/// <summary>
/// Summary description for LogicalOperator.
/// </summary>
public class LogicalOperator
{
    Bitmap bmpimg;
    public LogicalOperator()
    {
        //
        // TODO: Add constructor logic here
        //

    }

    public Bitmap XORing( Bitmap bmp )
    {
        BitmapData bmpData = bmpimg.LockBits( new Rectangle( 0 , 0 , bmpimg.Width , bmpimg.Height ) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb );
        BitmapData bmpData2 = bmp.LockBits( new Rectangle( 0 , 0 , bmp.Width , bmp.Height ) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb );

        int width = bmpData.Width;
        int height = bmpData.Height;

        if( bmpData2.Width > width )
            width = bmpData2.Width;
        if( bmpData2.Height > height )
            height = bmpData2.Height;

        bmpimg.UnlockBits( bmpData );
        bmp.UnlockBits( bmpData2 );

        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;
    }       

    public byte XOR_Operator( byte a , byte b )
    {

        byte A = ( byte )( 255 - a );
        byte B = ( byte )( 255 - b );

        return ( byte )( ( a & B ) | ( A & b ) );
    }

    public Bitmap XNORing( Bitmap bmp )
    {
 // NANDing of 2 images is done by ANDing 2 images then negating the resultant

        Bitmap orimg = XORing( bmp );

        BitmapData data = orimg.LockBits( new Rectangle( 0 , 0 , orimg.Width , orimg.Height ) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb );

        unsafe
        {
            int remain = data.Stride - data.Width * 3;

            byte* ptr = ( byte* )data.Scan0;

            for( int i = 0 ; i < data.Height ; i ++ )
            {
                for( int j = 0 ; j < data.Width * 3 ; j ++ )
                {

                    ptr[ 0 ] = invert( ptr[ 0 ] );
                    ptr ++;
                }

                ptr += remain;
            }

        }

        orimg.UnlockBits( data );

        return orimg;

    }

    public byte invert( byte b )
    {
        return ( byte )( 255 - b );
    }

    public void setImage( Bitmap bmp )
    {
        bmpimg = ( Bitmap )bmp.Clone( );  
    }

    public Bitmap getImage( )
    {
        return ( Bitmap )bmpimg.Clone( );
    }
}
}

【问题讨论】:

    标签: c# xor


    【解决方案1】:

    Xor 可以用“^”操作符来完成。例如。 "结果 = a ^ b"

    【讨论】:

    • 我在问这个问题 c# 我需要这个语言的解决方案。
    • 我建议的是 C# 代码 - XOR_Operator 方法会很慢,因此如果替换为我建议的方法可能会加快速度。
    【解决方案2】:

    在这个内部循环中使用 C/C++ 将大大加快速度。

    其他选择是:

    1. 在非托管代码中,如果您使用 GDI 而不是 GDI+ 绘图,则可以使用 SetROP2() 和 R2_XORPEN。这可能比您当前的循环更快,尽管您当前的循环看起来并不太吓人。

    2. 如果你的位图只是为了在屏幕上显示,你可以正常显示,然后用ControlPaint.DrawReversibleLine()覆盖它

    【讨论】:

    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多