Что нового

Как конвертировать между форматом графического объекта и массивом цветов пикселей (в обе стороны)?

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Это как-то можно исправить?
Конечно, можно. Но зачем акцентировать внимание на непонятом? Для чего вам эти решения, похожие на кривые костыли? Продолжайте строить изображения с нуля из массива пикселей и проводить углублённый анализ названия функции вместо её реализации. Это ведь так увлекательно - побайтово работать со структурой ради формата, от которого сама Microsoft давно уже отказалась.
 
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
63
Конечно, можно. Но зачем акцентировать внимание на непонятом? Для чего вам эти решения, похожие на кривые костыли? Продолжайте строить изображения с нуля из массива пикселей и проводить углублённый анализ названия функции вместо её реализации. Это ведь так увлекательно - побайтово работать со структурой ради формата, от которого сама Microsoft давно уже отказалась.
Видимо, не более увлекательно, чем чередовать весьма полезные сообщения с ребячеством.

По сути вопроса есть что-то?
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Совершенно верно. Только пост составлен из ваших же фраз.

Вот объясните. С какой целью вам нужно работать именно с 24-битным цветом?
GDI+ разработана под формат ARGB. Если вы посмотрите функции, работающие с цветом, то увидите именно этот формат. Поэтому, смело работайте в ARGB. Если вам не нужна прозрачность, заполняйте её FF. А когда получите готовую картинку, просто конвертируйте её в нужный формат
Код:
_GDIPlus_BitmapConvertFormat($hImage, $GDIP_PXF24RGB, 0, 0, 0)
 

Prog

Продвинутый
Сообщения
598
Репутация
77
24 бит на пиксель в GDI (без плюс).
 
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
63
Совершенно верно. Только пост составлен из ваших же фраз.
Если составить текст из букв моих сообщений, то ещё и не то можно придумать. Не надо вкладывать в непонятые слова придуманный смысл и на придуманное же обижаться.
А когда получите готовую картинку, просто конвертируйте её в нужный формат
Спасибо, так работает, но всё же вряд ли просто так справка к функции _GDIPlus_BitmapCreateFromScan0(() предусматривает опцию $GDIP_PXF24RGB в третьем параметре. Наверное, лучше сразу воспользоваться прямиком этой функцией. Хотелось бы понять, как это делается.
Сообщение автоматически объединено:

Позабавила в статье проекта, претендующего на энциклопедичность, фраза, начинающаяся словами "по слухам".
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Хотелось бы понять, как это делается
Что конкретно вам непонятно? Если вы про свой предыдущий код...
Вот немного подредактировал в плане улучшения читаемости. Теперь видите ошибку?
Код:
#include <GDIPlus.au3>
_GDIPlus_Startup()
Dim $iW = 200, $iH = 100, $aPixels[$iH][$iW]
Local $tPixel = DllStructCreate("BYTE[" & 3 * $iH * $iW & "];")
For $iCoordY = 0 To $iH - 1
    For $iCoordX = 0 To $iW - 1
        $iRed = Round(255 * $iCoordX / ($iW - 1))
        $iGreen = Round(255 * $iCoordY / ($iH - 1))
        $iBlue = 0
        $iOffset = 3 * ($iCoordY * $iW + $iCoordX)
        DllStructSetData($tPixel, $iBlue, $iOffset + 1)
        DllStructSetData($tPixel, $iGreen, $iOffset + 2)
        DllStructSetData($tPixel, $iRed, $iOffset + 3)
    Next
Next
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH, $GDIP_PXF24RGB, 3 * $iW, $tPixel)
$sFile = FileSaveDialog("Save the result image", @ScriptDir, "All (*.*)|Image (*.jpg;*.png;*.bmp;*.gif;*.tif)|JPG (*.jpg)|PNG (*.png)|BMP (*.bmp)|GIF (*.gif)|TIF (*.tif)")
_GDIPlus_ImageSaveToFile($hBitmap, $sFile)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()

В функциях DllStructSetData пропущен второй параметр
Код:
DllStructSetData($tPixel, 1, $iBlue, $iOffset + 1)
DllStructSetData($tPixel, 1, $iGreen, $iOffset + 2)
DllStructSetData($tPixel, 1, $iRed, $iOffset + 3)
 
  • Like
Реакции: Oki
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
63
В функциях DllStructSetData пропущен второй параметр
Код:
DllStructSetData($tPixel, 1, $iBlue, $iOffset + 1)
DllStructSetData($tPixel, 1, $iGreen, $iOffset + 2)
DllStructSetData($tPixel, 1, $iRed, $iOffset + 3)
Вдобавок, судя по одной найденной английской справке надо всё-таки дополнять строки до количества байт, кратного 4. В данном случае трижды 200 получилось 600, которое и так кратно 4.
Сообщение автоматически объединено:

Вот так будет работать и при ширине, которая не делится на 4.
Код:
#include <GDIPlus.au3>
_GDIPlus_Startup()
Dim $iW = 199, $iH = 100, $aPixels[$iH][$iW]
$iWBytes = 3 * $iW + Mod($iW, 4)
Local $tPixel = DllStructCreate("BYTE[" & $iH * $iWBytes & "];")
For $iCoordY = 0 To $iH - 1
    For $iCoordX = 0 To $iW - 1
        $iRed = Round(255 * $iCoordX / ($iW - 1))
        $iGreen = Round(255 * $iCoordY / ($iH - 1))
        $iBlue = 0
        $iOffset = $iCoordY * $iWBytes + 3 * $iCoordX
        DllStructSetData($tPixel, 1, $iBlue, $iOffset + 1)
        DllStructSetData($tPixel, 1, $iGreen, $iOffset + 2)
        DllStructSetData($tPixel, 1, $iRed, $iOffset + 3)
    Next
Next
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH, $GDIP_PXF24RGB, $iWBytes, $tPixel)
$sFile = FileSaveDialog("Save the result image", @ScriptDir, "All (*.*)|Image (*.jpg;*.png;*.bmp;*.gif;*.tif)|JPG (*.jpg)|PNG (*.png)|BMP (*.bmp)|GIF (*.gif)|TIF (*.tif)")
_GDIPlus_ImageSaveToFile($hBitmap, $sFile)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
 
Последнее редактирование:
Верх