Русское сообщество AutoIt

  • Май 22, 2012, 14:29:45 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:


Последняя финальная версия AutoIt: 3.3.8.1 (Скачать)
Последняя Beta версия AutoIt: 3.3.9.4 (Скачать)

Реклама

Автор Тема: Разбиваем Bitmap на по пиксельную матрицу  (Прочитано 495 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Viktor1703 [?]

  • AutoIt Гуру
  • *****
  • Репутация: 191
  • Offline Offline
  • Сообщений: 902
  • Версия AutoIt: 3.3.8.1
    • Награды
Написал код для разбиения картинки на пиксельную матрицу, применить данный пример практически негде, сегодня мне понадобилось сделать такую конструкцию и я решил выложить его здесь, буду рад советам по упрощению и оптимизации кода.

Код: AutoIt [Выделить]
#include <GDIP.au3>
#include <GDIPlus.au3>
#include <Array.au3>

$Matrix = MatrixGetColor(@ScriptDir & '\Image1.png')
_ArrayDisplay($Matrix)

Func MatrixGetColor($sImage)
   
   Local $hImage, $iWidth, $iHeight, $iBitmap, $hBitmap
   
   _GDIPlus_Startup()
   $hImage = _GDIPlus_ImageLoadFromFile($sImage)
   $iWidth = _GDIPlus_ImageGetWidth($hImage)
   $iHeight = _GDIPlus_ImageGetHeight($hImage)
   $iBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
   $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($iBitmap)
   
   Dim $iMatrix[$iHeight][$iWidth]
   
   For $H = 0 To $iHeight - 1
      For $W = 0 To $iWidth - 1
         $iMatrix[$H][$W] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $W, $H), 6)
      Next
   Next
   
   _GDIPlus_ImageDispose($hImage)
   _WinAPI_DeleteObject($iBitmap)
   _WinAPI_DeleteObject($hBitmap)
   _GDIPlus_Shutdown()
   
   Return $iMatrix
EndFunc  
 

Для работы необходима библиотека GDIP UDF




  Записан

Yashied [?]

  • Глобальный модератор
  • AutoIt MVP
  • *
  • *****
  • Репутация: 1909
  • Online Online
  • Пол: Мужской
  • Сообщений: 3970
  • Версия AutoIt: 3+
    • Награды
Re: Разбиваем Bitmap на по пиксельную матрицу
« Ответ #1, Отправлен: Февраль 15, 2012, 22:56:47 »
Если честно, то абсолютно бестолковый ход. Я конечно его не тестировал, но скорость должна быть "феноминальной".

Вообще, если у вас возникла необходимость переводить битмап в массив, то от этого сразу же нужно отказаться в пользу чего-нибудь другого. В крайнем случае использовать машинный код. Например, см. _WinAPI_IsAlphaBitmap() из WinAPIEx.au3.

Не подскажите, зачем вам понадобился массив?




  Записан
Думай, прежде чем говорить.

Viktor1703 [?]

  • AutoIt Гуру
  • *****

  • Автор темы
  • Репутация: 191
  • Offline Offline
  • Сообщений: 902
  • Версия AutoIt: 3.3.8.1
    • Награды
Re: Разбиваем Bitmap на по пиксельную матрицу
« Ответ #2, Отправлен: Февраль 15, 2012, 23:04:54 »
Да очень просто, я сам не сторонник такого хода, но меня попросили, есть возможность в Skype отправлять Html теги, вот и получается что можно таким образом отправить картинку:

<font color="#FEFEFE">#</font>
Получается что мы пишем # - почти белого цвета, но в Skype можно установить ещё и размер текста через тег и сделать пиксель белого цвета.

Если интересно. то вот пост на Хабрахабр на эту тему




  Записан

Yashied [?]

  • Глобальный модератор
  • AutoIt MVP
  • *
  • *****
  • Репутация: 1909
  • Online Online
  • Пол: Мужской
  • Сообщений: 3970
  • Версия AutoIt: 3+
    • Награды
Re: Разбиваем Bitmap на по пиксельную матрицу
« Ответ #3, Отправлен: Февраль 15, 2012, 23:15:25 »
Тогда, я думаю, лучше сразу резать данные битмапа рег. выражениями в html код.




  Записан

Viktor1703 [?]

  • AutoIt Гуру
  • *****

  • Автор темы
  • Репутация: 191
  • Offline Offline
  • Сообщений: 902
  • Версия AutoIt: 3.3.8.1
    • Награды
Re: Разбиваем Bitmap на по пиксельную матрицу
« Ответ #4, Отправлен: Февраль 15, 2012, 23:24:33 »
Чуть - чуть не понял, как это будет выглядеть? :think:




  Записан

Yashied [?]

  • Глобальный модератор
  • AutoIt MVP
  • *
  • *****
  • Репутация: 1909
  • Online Online
  • Пол: Мужской
  • Сообщений: 3970
  • Версия AutoIt: 3+
    • Награды
Re: Разбиваем Bitmap на по пиксельную матрицу
« Ответ #5, Отправлен: Февраль 15, 2012, 23:26:31 »
Код: AutoIt [Выделить]
#Include <GDIPlus.au3>

_GDIPlus_Startup()
$hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Image.png')
$Width = _GDIPlus_ImageGetWidth($hBitmap)
$Height = _GDIPlus_ImageGetHeight($hBitmap)
$tMap = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$bData = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
_GDIPlus_BitmapUnlockBits($hBitmap, $tMap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()

ConsoleWrite($bData & @CR)

Остается как-то отформатировать эту строку с помощью рег. выражений в то, что нужно. Но я с ними не дружу.

:)




  Записан

Viktor1703 [?]

  • AutoIt Гуру
  • *****

  • Автор темы
  • Репутация: 191
  • Offline Offline
  • Сообщений: 902
  • Версия AutoIt: 3.3.8.1
    • Награды
Re: Разбиваем Bitmap на по пиксельную матрицу
« Ответ #6, Отправлен: Февраль 15, 2012, 23:34:50 »
И на этом большое спасибо :) с рег. выражениями попробую позже разобратся :)




  Записан
 




Реклама

* Последние сообщения на форуме
post Re: Как заменить метку времени файла на севере
[Автоматизация IE и Web-интерфейса] eropov Сегодня в 14:11:37
post Re: Авторизация в одноклассниках
[Автоматизация IE и Web-интерфейса] Arei Сегодня в 13:24:59
post Re: Смена IP адресса
[AutoIt для новичков] Zaramot Сегодня в 13:04:33
post Re: Авторизация в одноклассниках
[Автоматизация IE и Web-интерфейса] Александр Сегодня в 12:59:21
post Re: Выполнение скрипта при нажатии средней кнопки мыши
[AutoIt для новичков] madmasles Сегодня в 12:23:31
post [Мышь, клавиатура] Re: Выполнение скрипта при нажатии средней кнопки мыши
[AutoIt для новичков] Nurgazy Сегодня в 12:09:36
post Re: Объясните плз, как работать с массивами ArrayAdd и прочее...
[AutoIt для новичков] madmasles Сегодня в 12:08:03
post Объясните плз, как работать с массивами ArrayAdd и прочее...
[AutoIt для новичков] webmonster Сегодня в 12:03:38
post Re: Как заменить метку времени файла на севере
[Автоматизация IE и Web-интерфейса] ---Zak--- Сегодня в 11:39:56
post Как заменить метку времени файла на севере
[Автоматизация IE и Web-интерфейса] eropov Сегодня в 11:26:37

* Пользователи онлайн
  • Dot Гостей: 133
  • Dot Скрыт: 2
  • Dot Пользователей: 32
  • Dot Пользователи Online: