Здравствуйте!
Есть две картинки.
Допустим:
LoadImage(0, #PB_Compiler_Home + "Examples\Sources\Data\GeeBee1.bmp")
LoadImage(1, #PB_Compiler_Home + "Examples\Sources\Data\GeeBee2.bmp")
Их необходимо сравнить поточечно и если хоть одна точка отличается, картинки разные.
Казалось бы элементарная задача, но....
К сожалению, функция Point не содержит такого параметра как номер изображения с которого считывается точка. Получается, что чтобы сравнить две картинки, одну из них надо загрузить в массив, а затем цвета точек второй картинки сравнивать со значениями в этом массиве...
Примерно так:
Height =ImageHeight(Num_Image)-1 Width = ImageWidth(Num_Image)-1 Dim Image_Array(Width, Height) StartDrawing (ImageID(0)) For y=0 To Height For x=0 To Width Image_Array(x,y) = Point(x,y) Next x Next y StopDrawing() StartDrawing (ImageID(1)) For y=0 To Height For x=0 To Width If Image_Array(x,y) <> Point(x,y) stop_image=1 Break 2 EndIf Next x Next y StopDrawing()
Всё бы ничего, но вот если мы сравниваем ни одну пару картинок, а множество пар картинок(в цикле), при этом картинки ещё и большие (например, размером с экран), то время 2 пары немаленьких циклов дают о себе знать.
Можно, конечно сократить количество циклов до двух:
For y=0 To Height For x=0 To Width StartDrawing (ImageID(0)) Image_Array(x,y) = Point(x,y) StopDrawing() StartDrawing (ImageID(1)) If Image_Array(x,y) <> Point(x,y) stop_image=1 Break 2 EndIf StopDrawing() Next x Next y
Но тогда код сильно замедляют StartDrawing\StopDrawing() А ведь это сравнение всего лишь двух картинок.
Допустим, нам надо сделать детектор изменения экрана....
Требуется:
1 сделать 2 скриншота
2 сравнить их между собой
3. если результат сравнения соответствует ожидаемому (например изображение поменялось\или не поменялось) - сообщить, в противном случае повторить цикл начиная с пункта 1.
Сам по себе скриншот делается почти мгновенно, а вот дальше начинаются проблемы, описанные выше. Даже запись цветов точек в массив по сравнению с временем создания скриншота, процесс долгий. Чтобы убедиться в этом достаточно сделать скриншот, а потом считать его по точкам. считывание займет куда больше времени чем сам скриншот!
И так при любой работе с графикой.... Например, если нам захочется, вдруг, (ради эксперимента) нарисовать картинку на весь экран по точкам(прорисовывая каждую точку отдельно, ну например из заранее заготовленного массива), мы буквально увидим, как по точкам появляется эта картинка) Однако если мы смотрим фильм с плейером на весь экран, кадры по точечкам у нас не прорисовываются(по крайней мере это происходит настолько быстро, что мы этого не замечаем). Это я к тому, что машина умеет быстро работать с графикой, причем как считывать её(время того же скриншота - почти мгновенно), так и выводить (видео, игры и т.п.) Вопрос лишь в том, "как это делается?"
Например:
1. Можно ли(и как) получить цвет точки картинки по координатам и номеру картинки не используя Point(x,y) и что более важно StartDrawing \ StopDrawing()
2. Минуя StartDrawing сразу загрузить картинку в двухмерный массив?