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