Что нового

Создание картинки из массива.

VadimKHL

Новичок
Сообщения
155
Репутация
0
Всем привет!

Помоги пожалуйста,
есть термограмма, массив данных размером 1024. В каждом элементе хранится оттенок зеленого от 0 до 255.
Как можно быстро нарисовать картинку размером 32х32 пикселя из этого массива?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()
Global $aValue[1024]
For $i = 0 To 1023
  $aValue[$i] = Random(0, 0xFFFFFF, 1)
Next

Global $iWidth = 32, $iHeight = 32
$tStruct = DllStructCreate("int color [" & $iWidth * $iHeight & "]")
For $i = 0 To UBound($aValue) - 1
  DllStructSetData($tStruct, "color", $aValue[$i], $i + 1)
Next
$hImage = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $GDIP_PXF32ARGB, $iWidth * 4, DllStructGetPtr($tStruct, "color"))
_GDIPlus_ImageSaveToFile($hImage, "pic.bmp")

_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Ооооо, огромное спасибо!
А то пытался попиксельно нарисовать при помощи _WinAPI_SetPixel.

Прокомментировал пример, для наглядности:
Код:
#include <GDIPlus.au3>
_GDIPlus_Startup()

; Задать размер картинки.
Global $iWidth = 32, $iHeight = 32

; Массив содержащий данные картинки, заполненный случайным образом.
Global $aPic[$iWidth * $iHeight]
For $i = 0 To UBound($aPic) - 1
  $aPic[$i] = Random(0, 0xFFFFFF, 1)
Next

; Создать структуру UINT(4 байта) с именем PIC размером высота * ширина картинки.
$tStruct = DllStructCreate("uint PIC[" & $iWidth * $iHeight & "]")
For $i = 0 To UBound($aPic) - 1
  DllStructSetData($tStruct, "PIC", $aPic[$i], $i + 1)
Next

; Создать картинку из структуры.
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $GDIP_PXF32ARGB, $iWidth * 4, DllStructGetPtr($tStruct, "PIC"))

; Сохранить в файл.
_GDIPlus_ImageSaveToFile($hBitmap, "pic.bmp")

; Удалить ресурсы GDI+.
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()


Не знаю, на сколько это актуально, но заменил _GDIPlus_ImageDispose() на _GDIPlus_BitmapDispose(),
как описано в хелпе.
Сообщение автоматически объединено:

Хелп, а почему не работает функция _GDIPlus_ImageResize с недавно созданным изображением?

Код:
#include <GDIPlus.au3>
_GDIPlus_Startup()

; Задать размер картинки.
Global $iWidth = 32, $iHeight = 32

; Массив содержащий данные картинки, заполненный случайным образом.
Global $aPic[$iWidth * $iHeight]
For $i = 0 To UBound($aPic) - 1
  $aPic[$i] = Random(0, 0xFFFFFF, 1)
Next

; Создать структуру UINT(4 байта) с именем PIC размером высота * ширина картинки.
$tStruct = DllStructCreate("uint PIC[" & $iWidth * $iHeight & "]")
For $i = 0 To UBound($aPic) - 1
  DllStructSetData($tStruct, "PIC", $aPic[$i], $i + 1)
Next

; Создать картинку из структуры.
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $GDIP_PXF32ARGB, $iWidth * 4, DllStructGetPtr($tStruct, "PIC"))

Local $hBitmap_Scaled = _GDIPlus_ImageResize($hBitmap, 320, 320) ;resize image

; Сохранить в файл.
_GDIPlus_ImageSaveToFile($hBitmap_Scaled, "pic.bmp")

; Удалить ресурсы GDI+.
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()


Сохраняется черный экран(((((
Что не так с созданной картинкой?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Что не так с созданной картинкой?
С картинкой всё в порядке. Просто у неё все пиксели прозрачные. Чтобы увидеть цвета заполните массив вот так
Код:
$aPic[$i] = BitOR(0xFF000000, Random(0, 0xFFFFFF, 1))


Не знаю, на сколько это актуально, но заменил
С точки зрения AutoIt объекты Image и Bitmap идентичны. Фактически, в терминологии AutoIt, это не объекты, а указатели на область памяти. Поэтому можно использовать любую функцию. Приведение типов GDI+ реализует самостоятельно.
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Спасибо разъяснение.
А можно суть происходящего, почему прозрачная картинка отображается при создании, а после растягивания уже не отображается?
Хотелось бы узнать эти тонкости)
Сообщение автоматически объединено:

С картинкой всё в порядке. Просто у неё все пиксели прозрачные. Чтобы увидеть цвета заполните массив вот так
Лайк от тепловизора))) за помощь!
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
почему прозрачная картинка отображается при создании
Потому что сохраняется в bmp. Если сохранить в png и открыть в программе с поддержкой прозрачности, то вы увидите только фон программы.

после растягивания уже не отображается
Функция _GDIPlus_ImageResize не входит в gdiplus.dll, она написана для удобства. Если посмотреть реализацию этой функции, то можно увидеть, что используется копирование оригинальной картинки на grapics, связанный с новым bitmap. Новый bitmap по умолчанию имеет чёрный фон. При копировании прозрачного цвета на чёрный фон результирующий цвет будет чёрным независимо от наличия данных в RGB составляющих. Поэтому новая картинка получается чёрной.
 
Последнее редактирование:
Верх