Что нового

Записать изображение в буфер обмена для вставки в Paint

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
В интернете по запросу изображения и буфер обмена информация есть, но точной информации так и не встретилось... либо примеры не рабочие, либо сугубо индивидуальные...

Интересует 2 вопроса:
1. Имеется сохранённый файл изображения (gif, bmp, jpg, png). Как записать его в буфер обмена, чтобы можно было вставить в графические программы, к примеру Paint

2. Как записать скриншот в буфер обмена, опять же для вставки в Paint
(как ни пытался, что-то не получается):

Код:
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#include <Clipboard.au3>

_GDIPlus_Startup()
$hBMP=_ScreenCapture_Capture("")
$hImage=_GDIPlus_BitmapCreateFromHBITMAP($hBMP)
_ClipBoard_Open(0)
_ClipBoard_Empty()
_ClipBoard_SetDataEx($hImage,$CF_BITMAP)
 _ClipBoard_Close()
_GDIPlus_ShutDown()
 
Автор
A

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
firex сказал(а):

в первой строке я об и написал, то что вы дали не то. Буфер пуст, а мне в него надо записать.
------------ Добавлено ----------
со 2-м вопросом разобрался
Код:
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#include <Clipboard.au3>

_GDIPlus_Startup()
$hBMP=_ScreenCapture_Capture("")
_ClipBoard_Open(0)
$hBitmap = _WinAPI_CopyImage( $hBMP, 0, 0, 0, BitOr( $LR_COPYDELETEORG, $LR_COPYRETURNORG ))
_ClipBoard_Empty()
_ClipBoard_SetDataEx($hBitmap, $CF_BITMAP)
_ClipBoard_Close()


Остался 1-й
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Andrey_A
Код:
#include <GDIPlus.au3>
#include <Clipboard.au3>
#include <WinAPIEx.au3>
#include <APIConstants.au3>

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile( @MyDocumentsDir & "\GDIPlus_Image.jpg" )
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap( $hImage )

$hBitmapCopy = _WinAPI_CopyImage( $hBitmap, 0, 0, 0, BitOr( $LR_COPYDELETEORG, $LR_COPYRETURNORG ) )
_WinAPI_DeleteObject( $hBitmap )

_ClipBoard_Open(0)
_ClipBoard_SetDataEx( $hBitmapCopy,  $CF_BITMAP )
_ClipBoard_Close()
_GDIPlus_Shutdown()


Там был ответ и на первый вопрос, вот он. ( за исключением ImageLoadFromFile )
 
Автор
A

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
firex
, спасибо. BMP нормально отправляет. PNG с прозрачностью тоже, но фон чёрный. Это как-то можно исправить?

---------- Добавлено --------------
Не знаю насколько это правильно, но получилось так:

Код:
#include <GDIPlus.au3>
#include <Clipboard.au3>
#include <WinAPIEx.au3>
#include <APIConstants.au3>

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile("D:\Картинки\putsite.png" )
$hBitmap = ConvertBitmap($hImage)
$hBitmapCopy = _WinAPI_CopyImage( $hBitmap, 0, 0, 0, BitOr( $LR_COPYDELETEORG, $LR_COPYRETURNORG ) )

_ClipBoard_Open(0)
_ClipBoard_Empty()
_ClipBoard_SetDataEx( $hBitmapCopy,  $CF_BITMAP )
_ClipBoard_Close()
_GDIPlus_Shutdown()

Func ConvertBitmap($hBitmap)
    Local $iButtonColor = _WinAPI_GetSysColor($COLOR_BTNFACE)
    $iButtonColor = 0x10000 * BitAND($iButtonColor, 0xFF) + BitAND($iButtonColor, 0x00FF00) + BitShift($iButtonColor, 16)
    $iWidth = _GDIPlus_ImageGetWidth($hBitmap)
    $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hBitmap_New = $aResult[6]
    Local $hCtx_new = _GDIPlus_ImageGetGraphicsContext($hBitmap_New)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $iButtonColor)
    _GDIPlus_GraphicsFillRect($hCtx_new, 0, 0, $iWidth, $iHeight, $hBrush)
    _GDIPlus_GraphicsDrawImageRect($hCtx_new, $hBitmap, 0, 0, $iWidth, $iHeight)
    Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_New)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BitmapDispose($hBitmap_New)
    _GDIPlus_GraphicsDispose($hCtx_new)
    Return $hHBitmap
EndFunc


Фон PNG конечно в буфере не прозрачный, а белый... но лучше чем чёрный))
Спасибо за помощь firex!
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
А почему вот эта переменная не определена?
$ghGDIPDll
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Vlasssov [?]
А почему вот эта переменная не определена?
$ghGDIPDll
Это в 3.3.8.1 открытая GDIPlus.dll, а в 3.3.12.0+ она уже $__g_hGDIPDll, из-за этого конфликт.
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
madmasles [?]
Это в 3.3.8.1 открытая GDIPlus.dll, а в 3.3.12.0+ она уже $__g_hGDIPDll, из-за этого конфликт.
Как я понял, при инициализации GDIPlus.dll с помощью

_GDIPlus_Startup()

создается переменная?

$__g_hGDIPDll

Или я что-то не улавливаю...
 
Верх