C# 在c中使用位图时参数无效#

C# 在c中使用位图时参数无效#,c#,C#,我不明白发生了什么,我将总结我想做的事情: 检查传入参数的图像是否等于第二个参数,从而生成第二个图像。到目前为止一切都很好 但是,当我运行并使用deleteDenialButton时,会出现一个错误,显示: 参数无效 因此,我检查了p_bmp是否用前面传递的图像初始化。 是的,p_bmp确实包含图像,因此包含图像的尺寸等 但是,当我用p\u bmp提供的高度和宽度创建一个新的矩形时,我得到了错误 所以我在崩溃的地方放了一个断点,即当创建一个值为p\u bmp和bim的新矩形时。rec

我不明白发生了什么,我将总结我想做的事情:

  • 检查传入参数的图像是否等于第二个参数,从而生成第二个图像。到目前为止一切都很好
  • 但是,当我运行并使用
    deleteDenialButton
    时,会出现一个错误,显示:
参数无效

  • 因此,我检查了
    p_bmp
    是否用前面传递的图像初始化。
    • 是的,
      p_bmp
      确实包含图像,因此包含图像的尺寸等
  • 但是,当我用
    p\u bmp
    提供的高度和宽度创建一个新的
    矩形时,我得到了错误
  • 所以我在崩溃的地方放了一个断点,即当创建一个值为
    p\u bmp
    bim的新矩形时。rect=null
    但是
    p\u bmp
    被很好地实现了小型化。
    • (矩形宽度,x,y,高度->全部0)(p_bmp宽度319,高度60)
有人能告诉我发生了什么事吗

private static byte[] RGBValues(Bitmap p_bmp)
{
    MessageBox.Show("b_bmp size: " + p_bmp.Width + " / " + p_bmp.Height);
    // Lock the bitmap's bits.
    Rectangle rect = new Rectangle(0, 0, p_bmp.Width, p_bmp.Height);
    BitmapData bmpData =
        p_bmp.LockBits(rect, ImageLockMode.ReadWrite,
        p_bmp.PixelFormat);

    // Get the address of the first line.
    IntPtr ptr = bmpData.Scan0;

    // Declare an array to hold the bytes of the bitmap.
    int bytes = bmpData.Stride * p_bmp.Height;
    byte[] rgbValues = new byte[bytes];

    Marshal.Copy(ptr, rgbValues, 0, bytes);

    // Unlock the bits.
    p_bmp.UnlockBits(bmpData);

    return rgbValues;
}

public bool imagePareil(Bitmap p_bmp1, Bitmap p_bmp2)
{
    byte[] bits1 = RGBValues(p_bmp1);
    byte[] bits2 = RGBValues(p_bmp2);

    int bitsLength = bits1.Length;
    int bitsLength2 = bits2.Length;

    if (bitsLength != bitsLength2)
        return false;
    for (int i = 0; i != bitsLength; i++)
    {
        if (bits1[i] != bits2[i])
            return false;
    }
    return true;
}

private void deleteDenialButton_Click(object sender, EventArgs e)
{
    if (Directory.Exists(PATHIMAGES))
    {
        string[] getFiles = Directory.GetFiles(PATHIMAGES);
        string fileDenialList = PATHDENIAL + "denial-list.txt";
        string[] getImages = File.ReadAllLines(fileDenialList);
        Bitmap bitmap1 = null, bitmap2 = null;

        foreach (string file in getFiles)
        {
            if (file != string.Empty)
            {
                bitmap1 = new Bitmap(file);
                for (int i = 0; i < getImages.Length; i++)
                {
                    string denialImage = PATHDENIAL + getImages[i];
                    bitmap2 = new Bitmap(denialImage);
                    try
                    {
                        if (EXTRA.imagePareil(bitmap1, bitmap2) == true)
                        {
                            bitmap1.Dispose();
                            bitmap2.Dispose();
                            try
                            {
                                File.Delete(file);
                            }
                            catch (IOException a) { MessageBox.Show(a.Message + "\n\nStackTrace : " + a.StackTrace + "\n\nInnerException :" + a.InnerException); }
                        }
                    }
                    catch (IOException a) { MessageBox.Show(a.Message + "\n\nStackTrace : " + a.StackTrace + "\n\nInnerException :" + a.InnerException); }
                }
            }                     
        }
        bitmap1.Dispose();
        bitmap2.Dispose();
    }
}
私有静态字节[]RGB值(位图p\U bmp)
{
MessageBox.Show(“b_bmp大小:+p_bmp.Width+”/“+p_bmp.Height”);
//锁定位图的位。
矩形rect=新矩形(0,0,p_bmp.Width,p_bmp.Height);
位图数据bmpData=
p_bmp.LockBits(rect、ImageLockMode.ReadWrite、,
p_bmp.pixel格式);
//获取第一行的地址。
IntPtr ptr=bmpData.Scan0;
//声明一个数组以保存位图的字节。
int bytes=bmpData.Stride*p_bmp.Height;
字节[]rgbValues=新字节[字节];
Marshal.Copy(ptr,rgbvalue,0,字节);
//解锁位。
p_bmp.解锁位(bmpData);
返回RGB值;
}
公共bool imagePareil(位图p_bmp1、位图p_bmp2)
{
字节[]位s1=RGB值(p_bmp1);
字节[]位S2=RGB值(p_bmp2);
int bitsLength=位1.长度;
int BitsLength 2=位2.长度;
if(比特长度!=比特长度2)
返回false;
for(int i=0;i!=位长度;i++)
{
if(位1[i]!=bits2[i])
返回false;
}
返回true;
}
私有void deleteDenialButton_单击(对象发送者,事件参数e)
{
if(Directory.Exists(PATHIMAGES))
{
字符串[]getFiles=Directory.getFiles(路径图像);
字符串fileDenialList=PATHDENIAL+“denialList.txt”;
字符串[]getImages=File.ReadAllLines(FileDeniAllList);
位图bitmap1=null,bitmap2=null;
foreach(getFiles中的字符串文件)
{
if(file!=string.Empty)
{
bitmap1=新位图(文件);
for(int i=0;i