все дело в том, что с помощью метода CopyFromScreen()
я смог сравнить изображение (захваченное ранее) с изображением, которое совпадает с захваченным, потому что оно фактически захвачено с этого конкретного экрана.
или проще, например, значок, обрезанный с рабочего стола и сохраненный как изображение вместе с текстовым файлом, указывающим его местоположение (точку) и его размер (размер (h, w))
поэтому, когда мы записали .bar через File.WriteAllBytes(byte[]made it .bar) в файл + cuptured.txt со ссылкой на местоположение и размер, у нас есть копия, сохраненная на жестком диске, а также ее местоположение и размер в txt. (мне не нужно было публиковать весь код, но он отлично работает, поэтому, если кому-то это нужно, я делюсь, не стесняйтесь)
способ, которым я достиг этого, заключается в использовании метода, который я сделал DoCopyFScr()
- для захвата части экрана, которая использует Bitmap2ByteArr()
- сохранение растрового изображения как ByteArr, а затем позже, когда это необходимо, с использованием байта [] - сохранено, чтобы сравнить с его захваченным местоположением на экране.
public void DoCopyFScr(Point SourceP, Size Mysz, string initDir, string Fname, bool SaveIt, bool DoCompare)
{
SetForegroundWindow(A window handle suplied here);
pause(200);
Point pZero = new Point(0, 0);
using (Bitmap bitmap = new Bitmap(Mysz.Width, Mysz.Height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(SourceP, pZero, Msyz);
}
Image img = (Image)bitmap;
Clipboard.SetImage(img);
ItsCopiedFromScreen = true;
MyBtmpToByteArr b2arr = new MyBtmpToByteArr();// inststance of My bitmap to byte[]
AAdToAppLog("start Converting Bitmap To ByteArr");// logging programs activity in a listview via reflection
MyCuptredBtmpToolBox.CuptByteArr = b2arr.Bitmap2ByteArr(bitmap);
AAdToAppLog("Done Convertion ArrSize " + b2arr.Bitmap2ByteArr(bitmap).Length + ", Resting CopyDestionation SelctdIndx");
Combo_CopyFromScrn.SelectedIndex = 0;
if (SaveIt)
{
string btmpsRefrenceSave = MyCuptredBtmpToolBox.SourceX_Cuptured.ToString() + "," + MyCuptredBtmpToolBox.SourceY_Cuptured.ToString() + "," + MyCuptredBtmpToolBox.RectWidth_Cuptured.ToString() + "," + MyCuptredBtmpToolBox.RectHeight_Cuptured.ToString() + "," + TBX_FileSaveName.Text;
if (ItsLoadedFromFile)
{
File.WriteAllBytes(initDir + TBX_FileSaveName.Text, b2arr.Bitmap2ByteArr(bitmap));// See next block Method Bitmap2ByteArr method
File.WriteAllText(initDir + TBX_FileSaveName.Text.Replace("bar", "txt"), btmpsRefrenceSave);
}
else
{
File.WriteAllBytes(initDir + TBX_FileSaveName.Text + ExtBar, b2arr.Bitmap2ByteArr(bitmap));
File.WriteAllText(initDir + TBX_FileSaveName.Text.Replace("bar", "txt") + ExtTXT, btmpsRefrenceSave);
}
//MyCuptredBtmpToolBox.CupturedStaticBmp.Save(MyCuptredBtmpToolBox.FnameToSave.Replace(".bar", ".") + ExtJpg, ImageFormat.Jpeg);
bitmap.Save(initDir + TBX_FileSaveName.Text + ExtJpg, ImageFormat.Jpeg);
}
if (DoCompare)
{
AAdToAppLog("starting Compare " + Fname +" With Btmp2Arr From Screen");
R_ComparwByteArrClass tstCmp = new R_ComparwByteArrClass();
if (itsAutomated)
{
CompareByt2Btmp = R_ComparwByteArrClass.ByteArrCompare(DoAutoLoadCuptByteArr(initDir, Fname + ExtBar), b2arr.Bitmap2ByteArr(bitmap));
}
else
{
CompareByt2Btmp = R_ComparwByteArrClass.ByteArrCompare(MyLoadedBtmpToolBox.LoadedByteArr, b2arr.Bitmap2ByteArr(bitmap));
}
bring(MyApp);
AAdToAppLog(CompareByt2Btmp.ToString());
}
}
}
растровое изображение в класс ByteArr с методом преобразования захваченного btmp в byte[]
public class MyBtmpToByteArr
{
public byte[] Bitmap2ByteArr(Bitmap btmpToConvertintoByteArr)
{
//Convert image to a byte array
System.Drawing.ImageConverter MyImgCvrtr = new System.Drawing.ImageConverter();
byte[] btImage = new byte[1];
btImage = (byte[])MyImgCvrtr.ConvertTo(btmpToConvertintoByteArr, btImage.GetType());
return btImage;
}
}
но если местоположение изменено, я не могу его идентифицировать, даже если я указал новое местоположение изображения на экране, хотя, когда я тестировал, используя краску и с включенной сеткой, я расположил две копии одного и того же обрезанного изображения, и я добился успеха, но в реальном сценарии с игровым экраном, где есть общий фон для нескольких значков, я пытаюсь сравнить их друг с другом и не преуспеваю, хотя я указал местоположение, есть ли единица измерения меньше пикселя может графика в игре использует некую единицу измерения это доли пикселя?? или, может быть, другая единица измерения, поэтому, возможно, заданное местоположение Point1 равно X100 Y100 для первого значка, а другое вместо 200 200 на самом деле находится в 200,33, 200,55 или около того ... и поэтому я не получаю позицию / местоположение мертвой блокировки? ps я думаю, что он использует diretx, если нет, это на openGL, почти наверняка на directx, если это имеет значение для того, какие единицы используются для поиска изображений существует ли единица меньше пикселей вообще ... и широко используется? если нет, как бы вы реализовали функцию, которая будет зацикливаться, скажем, от x100 до x150 и от y100 до y150, чтобы я мог искать изображение