Что нового

Рисование изображения в виде таблицы с данными

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Имеются данные в массиве, мне нужно эти данные вынести в файл изображения в виде таблицы (экспорт данных).
У кого то есть идеи как такое реализовать? :scratch:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Пример рисования таблицы с одинаковой шириной столбцов
Код:
#include <GDIPlus.au3>

Global $aStrings[][] = [["раз","два","три"],["четыре","пять","шесть"],["семь","восемь","девять"]]

_GDIPlus_Startup()
$hGUI = GUICreate("")
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
GUIDelete($hGUI)

; создаём шрифт и необходимые атрибуты
$hFamily = _GDIPlus_FontFamilyCreate("Arial")
$hFont = _GDIPlus_FontCreate($hFamily, 12)
$hFormat = _GDIPlus_StringFormatCreate()
_GDIPlus_StringFormatSetAlign($hFormat, 1)
$tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)

; находим самую длинную строку (высота у всех строк одинаковая)
$iWidth = 0
For $i = 0 To UBound($aStrings, 1) - 1
  For $j = 0 To UBound($aStrings, 2) - 1
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $aStrings[$i][$j], $hFont, $tLayout, $hFormat)
    If $iWidth < $aInfo[0].Width Then $iWidth = $aInfo[0].Width
  Next
Next
$iWidth = Ceiling($iWidth) ; максимальная ширина
$iHeight = Ceiling($aInfo[0].Height) ; одинаковая высота

; создаём объекты рисования
$hImage = _GDIPlus_BitmapCreateFromGraphics($iWidth * UBound($aStrings, 1) + 1, $iHeight * UBound($aStrings, 2) + 1, $hGraphic)
_GDIPlus_GraphicsDispose($hGraphic)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
_GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF)

; рисуем таблицу
$tLayout.Width = $iWidth
$tLayout.Height = $iHeight
For $i = 0 To UBound($aStrings, 1) - 1
  $tLayout.Y = $i * $iHeight
  For $j = 0 To UBound($aStrings, 2) - 1
    $tLayout.X = $j * $iWidth
    _GDIPlus_GraphicsDrawRect($hGraphic, $tLayout.X, $tLayout.Y, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawStringEx($hGraphic, $aStrings[$i][$j], $hFont, $tLayout, $hFormat, $hBrush)
  Next
Next

; сохраняем рисунок
_GDIPlus_ImageSaveToFile($hImage, "table.png")
ShellExecute("table.png")

; очищаем память
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
Пример рисования таблицы с одинаковой шириной столбцов
Круто!

А можно это немного(?) усовершенствовать, чтобы была примерно такая функция:

Код:
Dim $aTable[][] = _
	[ _
		['col1(font,color,bkcolor)', 'col2(font,color,bkcolor)', 'col3(font,color,bkcolor)'], _
		['row1(font,color,bkcolor)', 'row2(font,color,bkcolor)', 'row3(font,color,bkcolor)'] _
	]

Func _GDIPlus_ImageDrawCell($aTable)
	
EndFunc


Если одна из строчек (row) не указана, то в таблице её нужно как бы пропустить, чтобы было пусто.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В общем вот такой примерно нужен результат:



В таблице куча данных, и нужно найти способ их всех вынести в изображение, причём расцветка разная для разных ячеек.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
CreatoR
вот такой примерно
Картинка не отображается, поэтому сделал, как смог :smile:
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()

; Пример 1
Global $aStrings[][] = [["раз|0xFFFF0000|0xFFFFFF00","два|0xFF00FF00|0xFF0000FF","три|0xFF0000FF|0xFFF00FFF"], _
                        ["четыре|0xFF800080|0xFF121212","пять|0xFF101010|0xFF80FF00","шесть|0xFF000000|0xFFC0C0C0"], _
                        ["семь|0xFF808000|0xFF646464","восемь|0xFF008000|0xFFC0FFFF","девять|0xFF8080C0|0xFFC080FF"]]
$hImg = _Table2Image($aStrings)
_GDIPlus_ImageSaveToFile($hImg, "table1.png")
If Not @error Then ShellExecute("table1.png")
_GDIPlus_ImageDispose($hImg)

; Пример 2
Global $aStrings[][] = [["семь,,","восемь,,0xFFFF0000","девять,0xFFFF0000,"]]
$hImg = _Table2Image($aStrings, ",", "Courier New", 20, 1, 0, False)
_GDIPlus_ImageSaveToFile($hImg, "table2.png")
If Not @error Then ShellExecute("table2.png")
_GDIPlus_ImageDispose($hImg)

_GDIPlus_Shutdown()

; ============================================================================================
; Имя функции : _Table2Image
; Описание    : Преобразует двумерный массив в изображение
; Синтаксис   : _Table2Image(Const ByRef $aTable[, $sDelim = "|"[, $sFont = "Arial"[, $iSize = 12[, $iStyle = 0[, $iAlign = 1[, $fGrid = True]]]]]])
; Параметры   : $aTable - двумерный массив в формате "текст|цвет_текста|цвет_фона"
;             : $sDelim - разделитель формата (по умолчанию "|")
;             : $sFont  - имя шрифта (по умолчанию "Arial")
;             : $iSize  - размер шрифта (по умолчанию 12)
;             : $iStyle - стиль шрифта
;             :           0 - нормальный (по умолчанию)
;             :           1 - жирный
;             :           2 - курсив
;             :           4 - подчёркнутый
;             :           8 - зачёркнутый
;             : $iAlign - выравнивание шрифта
;             :           0 - по левому краю
;             :           1 - по центру (по умолчанию)
;             :           2 - по правому краю
;             : $fGrid  - отображать границы ячеек (по умолчанию True)
; Возвращает  : Успех   - объект Bitmap GDI+
;             : Неудача - 0 и устанавливает @error
;             :         @error = 1 - первый параметр не массив или массив не двумерный
;             :         @error = 2 - ошибка формата элементов массива
;             :         @error = 3 - ошибка создания шрифта
; Автор       : InnI
; Примечание  : Стили шрифта можно суммировать (6 = 2 + 4 : подчёркнутый курсив)
; ============================================================================================
Func _Table2Image(Const ByRef $aTable, $sDelim = "|", $sFont = "Arial", $iSize = 12, $iStyle = 0, $iAlign = 1, $fGrid = True)
  If Not IsArray($aTable) Or UBound($aTable, 0) <> 2 Then Return SetError(1, 0, 0)
  For $i = 0 To UBound($aTable, 1) - 1
    For $j = 0 To UBound($aTable, 2) - 1
      If UBound(StringSplit($aTable[$i][$j], $sDelim, 3)) <> 3 Then Return SetError(2, 0, 0)
    Next
  Next

  Local $hDC, $hGraphic, $hFamily, $hFont, $hFormat, $tLayout, $hBrush, $iWidth, $iHeight, $hBitmap, $aData
  $hDC = _WinAPI_GetDC(0)
  $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC)
  _WinAPI_ReleaseDC(0, $hDC)

  ; создание шрифта и необходимых атрибутов
  $hFamily = _GDIPlus_FontFamilyCreate($sFont)
  $hFont = _GDIPlus_FontCreate($hFamily, $iSize, $iStyle)
  If @error Then Return SetError(3, 0, 0)
  $hFormat = _GDIPlus_StringFormatCreate()
  _GDIPlus_StringFormatSetAlign($hFormat, $iAlign)
  $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
  $hBrush = _GDIPlus_BrushCreateSolid()

  ; расчёт размеров ячеек
  Local $aWidth[UBound($aTable, 2)]
  For $i = 0 To UBound($aTable, 1) - 1
    For $j = 0 To UBound($aTable, 2) - 1
      $aData = StringSplit($aTable[$i][$j], $sDelim, 3)
      $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $aData[0], $hFont, $tLayout, $hFormat)
      If $aWidth[$j] < $aInfo[0].Width Then $aWidth[$j] = Ceiling($aInfo[0].Width)
      If $iHeight < $aInfo[0].Height Then $iHeight = Ceiling($aInfo[0].Height)
    Next
  Next

  ; создание объектов рисования
  For $i = 0 To UBound($aWidth) - 1
    $iWidth += $aWidth[$i]
  Next
  $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth + $fGrid, $iHeight * UBound($aTable, 1) + $fGrid, $hGraphic)
  _GDIPlus_GraphicsDispose($hGraphic)
  $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)

  ; рисование таблицы
  $tLayout.Height = $iHeight
  For $i = 0 To UBound($aTable, 1) - 1
    $tLayout.Y = $i * $iHeight
    For $j = 0 To UBound($aTable, 2) - 1
      $tLayout.Width = $aWidth[$j]
      $tLayout.X = ($j = 0) ? 0 : $tLayout.X + $aWidth[$j - 1]
      $aData = StringSplit($aTable[$i][$j], $sDelim, 3)
      If Not $aData[2] Then $aData[2] = 0xFFFFFFFF
      If Not $aData[1] Then $aData[1] = 0xFF000000
      _GDIPlus_BrushSetSolidColor($hBrush, $aData[2])
      _GDIPlus_GraphicsFillRect($hGraphic, $tLayout.X, $tLayout.Y, $aWidth[$j], $iHeight, $hBrush)
      If $fGrid Then _GDIPlus_GraphicsDrawRect($hGraphic, $tLayout.X, $tLayout.Y, $aWidth[$j], $iHeight)
      _GDIPlus_BrushSetSolidColor($hBrush, $aData[1])
      _GDIPlus_GraphicsDrawStringEx($hGraphic, $aData[0], $hFont, $tLayout, $hFormat, $hBrush)
    Next
  Next

  ; очистка памяти
  _GDIPlus_FontDispose($hFont)
  _GDIPlus_FontFamilyDispose($hFamily)
  _GDIPlus_StringFormatDispose($hFormat)
  _GDIPlus_BrushDispose($hBrush)
  _GDIPlus_GraphicsDispose($hGraphic)

  Return $hBitmap
EndFunc  ;==>_Table2Image


Добавлено отображение сетки $fGrid = True.
В случае отсутствия цвета применяется чёрный для текста и белый для фона (см. "Пример 2").
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Изображение прикрепил.
Пример отличный, но никак не могу сообразить как это применить на практике (см. изображение).
 

Вложения

  • ImageTable.png
    ImageTable.png
    160.1 КБ · Просмотры: 30

InnI

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

_GDIPlus_Startup()

Global $aStrings[][] = [["Day|0xFFC16100|","From time|0xFFC16100|","To time|0xFFC16100|","Holiday 150%|0xFFC16100|","Holiday 200%|0xFFC16100|","Holiday Full 150%|0xFFC16100|","Holiday In|0xFFC16100|","100% hours|0xFFC16100|","125% hours|0xFFC16100|","150% hours|0xFFC16100|","175% hours|0xFFC16100|","200% hours|0xFFC16100|","Total hours|0xFFC16100|","Notes|0xFFC16100|"], _
                        ["01 (Fr)||0xFFDDDDFF","13:00||","21:00||","False||","False||","False||","False||","4||","0||","3.5||","0||","0||","7.5||0xFF00FF00","||"], _
                        ["09 (Sa)||0xFFFF8282","00:00||","00:00||","False||","False||","False||","False||","4||","0||","0||","0||","0||","0||0xFF00FF00","||"], _
                        ["28 (Th)||0xFFDDDDFF","16:30||","23:00||","False||","False||","False||","False||","6||","0||","0||","0||","0||","6||0xFF00FF00","Missing checkout time||"]]
$hImg = _Table2Image($aStrings, "|", "Times New Roman", 10.5, 1)
_GDIPlus_ImageSaveToFile($hImg, "table.png")
If Not @error Then ShellExecute("table.png")
_GDIPlus_ImageDispose($hImg)

_GDIPlus_Shutdown()



Добавлено:
Сообщение автоматически объединено:

Добавлен стиль шрифта $iStyle = 0.
Ширина рассчитывается по самой длинной строке в каждом столбце.
Соответственно отредактированы ответы #4 и #6.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI
Супер!

Теперь осталось придумать как добавлять заголовки вне таблицы, т.е чтобы в начале была некая надпись-заголовок, и между таблицами были надписи.

В идеале, наверное должны быть простые функции для работы с изображением, типа такого:

Код:
_Image_Open($iWidth, $iHeight) ;Открываем изображение (создаётся указатель на изображение - $hImage)
_Image_DrawLabel($hImage, $sText, $iLeft, $iTop) ;Рисуем надпись в указанном месте на холсте
_Image_DrawTable($hImage, $aTable, $iLeft, $iTop) ;Рисуем таблицу в указанном месте на холсте (по мотивам Table2Image)
_Image_Close($hImage, $sFile) ;Закрываем изображение (сохранение и освобождение ресурсов)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
CreatoR
добавлять заголовки вне таблицы
Как вариант, можно создать отдельные изображения строк и таблиц, рассчитать общий bitmap, и скопировать их на него в нужном порядке. Кстати, строки можно выводить в виде таблиц без сетки (см. ниже примеры 2 и 3).

Упростил формат. Теперь можно не добавлять разделители для использования цвета по умолчанию (чёрный текст на белом фоне).
Добавил построчный расчёт высоты для создания многострочных ячеек.
Соответственно, добавлен параметр выравнивания по вертикали $iVAlign.
Все умолчания заменены на Default
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()

; Пример 1
Global $aStrings[][] = [["раз|0xFFFF0000|0xFFFFFF00","два" & @CRLF & "плюс два|0xFF00FF00|0xFF0000FF","три|0xFF0000FF|0xFFF00FFF"], _
                        ["четыре|0xFF800080|0xFF121212","пять|0xFF101010|0xFF80FF00","шесть|0xFF000000|0xFFC0C0C0"], _
                        ["семь" & @CRLF & "с половиной|0xFF808000|0xFF646464","восемь|0xFF008000|0xFFC0FFFF","ДЕВЯТЬ"]]
$hImg = _Table2Image($aStrings)
_GDIPlus_ImageSaveToFile($hImg, "table1.png")
If Not @error Then ShellExecute("table1.png")
_GDIPlus_ImageDispose($hImg)

; Пример 2
Global $aStrings[][] = [["Это таблица из одной ячейки" & @CRLF & "и выглядит она, как" & @CRLF & "многострочный текст||0xFFC0C0C0"]]
$hImg = _Table2Image($aStrings, Default, Default, Default, 1, 0, Default, False)
_GDIPlus_ImageSaveToFile($hImg, "table2.png")
If Not @error Then ShellExecute("table2.png")
_GDIPlus_ImageDispose($hImg)

; Пример 3
Global $aStrings[][] = [["Это таблица из трёх ячеек,"],["но она выглядит,"],["как многострочный текст"]]
$hImg = _Table2Image($aStrings, Default, Default, Default, Default, 0, Default, False)
_GDIPlus_ImageSaveToFile($hImg, "table3.png")
If Not @error Then ShellExecute("table3.png")
_GDIPlus_ImageDispose($hImg)

_GDIPlus_Shutdown()

; ============================================================================================
; Имя функции : _Table2Image
; Описание    : Преобразует двумерный массив в изображение
; Синтаксис   : _Table2Image(Const ByRef $aTable[, $sDelim = Default[, $sFont = Default[, $iSize = Default[, $iStyle = Default[, $iHAlign = Default[, $iVAlign = Default[, $fGrid = Default]]]]]]])
; Параметры   : $aTable  - двумерный массив в формате "текст[|цвет_текста[|цвет_фона]]" (по умолчанию чёрный текст на белом фоне)
;             : $sDelim  - разделитель формата (по умолчанию "|")
;             : $sFont   - имя шрифта (по умолчанию "Arial")
;             : $iSize   - размер шрифта (по умолчанию 12)
;             : $iStyle  - стиль шрифта
;             :            0 - нормальный (по умолчанию)
;             :            1 - жирный
;             :            2 - курсив
;             :            4 - подчёркнутый
;             :            8 - зачёркнутый
;             : $iHAlign - выравнивание текста по горизонтали
;             :            0 - по левому краю
;             :            1 - по центру (по умолчанию)
;             :            2 - по правому краю
;             : $iVAlign - выравнивание текста по вертикали
;             :            0 - по верхней границе
;             :            1 - по центру (по умолчанию)
;             :            2 - по нижней границе
;             : $fGrid   - отображать границы ячеек (по умолчанию True)
; Возвращает  : Успех   - объект Bitmap GDI+
;             : Неудача - 0 и устанавливает @error
;             :         @error = 1 - первый параметр не массив или массив не двумерный
;             :         @error = 2 - ошибка создания шрифта
; Автор       : InnI
; Примечание  : Стили шрифта можно суммировать (6 = 2 + 4 : подчёркнутый курсив)
; ============================================================================================
Func _Table2Image(Const ByRef $aTable, $sDelim = Default, $sFont = Default, $iSize = Default, $iStyle = Default, $iHAlign = Default, $iVAlign = Default, $fGrid = Default)
  If Not IsArray($aTable) Or UBound($aTable, 0) <> 2 Then Return SetError(1, 0, 0)
  If $sDelim = Default Then $sDelim = "|"
  If $sFont = Default Then $sFont = "Arial"
  If $iSize = Default Then $iSize = 12
  If $iStyle = Default Then $iStyle = 0
  If $iHAlign = Default Then $iHAlign = 1
  If $iVAlign = Default Then $iVAlign = 1
  If $fGrid = Default Then $fGrid = True

  Local $hDC, $hGraphic, $hFamily, $hFont, $hFormat, $tLayout, $hBrush, $iWidth, $iHeight, $hBitmap, $aData
  $hDC = _WinAPI_GetDC(0)
  $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hDC)
  _WinAPI_ReleaseDC(0, $hDC)

  ; создание шрифта и необходимых атрибутов
  $hFamily = _GDIPlus_FontFamilyCreate($sFont)
  $hFont = _GDIPlus_FontCreate($hFamily, $iSize, $iStyle)
  If @error Then Return SetError(2, 0, 0)
  $hFormat = _GDIPlus_StringFormatCreate()
  _GDIPlus_StringFormatSetAlign($hFormat, $iHAlign)
  _GDIPlus_StringFormatSetLineAlign($hFormat, $iVAlign)
  $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
  $hBrush = _GDIPlus_BrushCreateSolid()

  ; расчёт размеров ячеек
  Local $aWidth[UBound($aTable, 2)], $aHeight[UBound($aTable, 1)]
  For $i = 0 To UBound($aTable, 1) - 1
    For $j = 0 To UBound($aTable, 2) - 1
      $aData = StringSplit($aTable[$i][$j], $sDelim, 3)
      $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $aData[0], $hFont, $tLayout, $hFormat)
      If $aWidth[$j] < $aInfo[0].Width Then $aWidth[$j] = Ceiling($aInfo[0].Width)
      If $aHeight[$i] < $aInfo[0].Height Then $aHeight[$i] = Ceiling($aInfo[0].Height)
    Next
  Next

  ; создание объектов рисования
  For $i = 0 To UBound($aWidth) - 1
    $iWidth += $aWidth[$i]
  Next
  For $i = 0 To UBound($aHeight) - 1
    $iHeight += $aHeight[$i]
  Next
  $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth + $fGrid, $iHeight + $fGrid, $hGraphic)
  _GDIPlus_GraphicsDispose($hGraphic)
  $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)

  ; рисование таблицы
  For $i = 0 To UBound($aTable, 1) - 1
    $tLayout.Height = $aHeight[$i]
    $tLayout.Y = ($i = 0) ? 0 : $tLayout.Y + $aHeight[$i - 1]
    For $j = 0 To UBound($aTable, 2) - 1
      $tLayout.Width = $aWidth[$j]
      $tLayout.X = ($j = 0) ? 0 : $tLayout.X + $aWidth[$j - 1]
      $aData = StringSplit($aTable[$i][$j], $sDelim, 3)
      ReDim $aData[3]
      If Not $aData[2] Then $aData[2] = 0xFFFFFFFF
      If Not $aData[1] Then $aData[1] = 0xFF000000
      _GDIPlus_BrushSetSolidColor($hBrush, $aData[2])
      _GDIPlus_GraphicsFillRect($hGraphic, $tLayout.X, $tLayout.Y, $aWidth[$j], $aHeight[$i], $hBrush)
      If $fGrid Then _GDIPlus_GraphicsDrawRect($hGraphic, $tLayout.X, $tLayout.Y, $aWidth[$j], $aHeight[$i])
      _GDIPlus_BrushSetSolidColor($hBrush, $aData[1])
      _GDIPlus_GraphicsDrawStringEx($hGraphic, $aData[0], $hFont, $tLayout, $hFormat, $hBrush)
    Next
  Next

  ; очистка памяти
  _GDIPlus_FontDispose($hFont)
  _GDIPlus_FontFamilyDispose($hFamily)
  _GDIPlus_StringFormatDispose($hFormat)
  _GDIPlus_BrushDispose($hBrush)
  _GDIPlus_GraphicsDispose($hGraphic)

  Return $hBitmap
EndFunc  ;==>_Table2Image
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI
Это то, что нужно!

Единственное пожелание, если можно, добавить поддержку стиля для каждой ячейки отдельно, просто некоторые ячейки (к примеру заголовки) должны выделяться.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
CreatoR
добавить поддержку стиля для каждой ячейки отдельно
Стиль - это атрибут шрифта и он влияет на размеры текста. Придётся для каждой ячейки создавать собственный шрифт, рассчитывать размеры текста и сохранять этот шрифт в массиве для дальнейшей индивидуальной отрисовки ячеек. Данные изменения откроют возможность задавать полностью индивидуальные шрифты для каждой ячейки (имя, размер, стиль). Дальше последуют индивидуальные выравнивания. В результате каждый элемент массива станет набором параметров текущей реализации. А ещё не плохо бы цвет и толщину сетки задавать.

Короче, есть куда стремиться, но я пока остановлюсь на текущей реализации с общим шрифтом.
Если у кого есть желание - пожалуйста, добавляйте функционал, не стесняйтесь.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
InnI [?]
Если у кого есть желание - пожалуйста, добавляйте функционал, не стесняйтесь.
По мне тут все хорошо и так. А все что сложнее - лучше в html. (Там как раз это делается просто и скриншот можно снять без браузера).
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
CreatoR [?]
Только убрать Navigate а сразу записать через Write весь html код.
Код:
Func _WebCapture($Url, $WebWidth = 1024)

    Local $oIE = ObjCreate("Shell.Explorer.2")
    Local $hGUI = GUICreate("", $WebWidth, 768, -1, -1)
    Local $cObj = GUICtrlCreateObj($oIE, 0, 0, $WebWidth, 768)

    _IELoadWaitTimeout(20000) ; 20 sec
    _IENavigate($oIE, $Url)
    _IELoadWait($oIE)

    Local $oDocument = $oIE.document
    Local $oBody = $oIE.document.body
    Local $oHtml = $oIE.document.documentElement

    $oBody.scroll = "no"
    $oBody.style.borderStyle = "none"
    $oHtml.style.overflow = 'hidden'
    $oBody.style.overflow = 'hidden'

    Local $oIViewObject2 = ObjCreateInterface($oDocument, "{00000127-0000-0000-C000-000000000046}", "Draw hresult(dword;long;ptr;ptr;handle;handle;struct*;struct*;bool;ulong_ptr);")

    If @error Then Return SetError(1, 0, 0)

    Local $BodyWidth = $oBody.scrollWidth
    Local $BodyHeight = $oBody.scrollHeight
    Local $RootWidth = $oHtml.scrollWidth
    Local $RootHeight = $oHtml.scrollHeight

    Local $Width = $BodyWidth
    Local $Height = $RootHeight
    If $BodyHeight > $Height Then $Height = $BodyHeight

    $oIE.width = $Width
    $oIE.height = $Height

    Local $hDC = _WinAPI_GetDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $Width, $Height)
    _WinAPI_SelectObject($hMemDC, $hBmp)

    Local $sRECT = DllStructCreate($tagRECT)
    DllStructSetData($sRECT, "Top", 0)
    DllStructSetData($sRECT, "Left", 0)
    DllStructSetData($sRECT, "Right", $Width)
    DllStructSetData($sRECT, "Bottom", $Height)

    $oIViewObject2.Draw(1, -1, 0, 0, $hDC, $hMemDC, $sRECT, 0, 0, 0)

    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_ReleaseDC(0, $hDC)

    GUIDelete($hGUI)

    Return $hBmp
EndFunc   ;==>_WebCapture
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs
Так это используя IE :laugh:.
Ок идею понял, спасибо, буду пробовать.
 
Верх