Что нового

Перетащить картинку в окно пропорционально

Scampy

Новичок
Сообщения
50
Репутация
0
Добрый день!
Подскажите как реализовать перетаскивание картинки в окно с сохранением пропорции картинки? Скажем чтоб по длине заполнялось по максимуму и отображалась в центре окна.
Нашел вот такой скрипт, можно ли допилить его?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 600, 440, -1, -1, -1, $WS_EX_ACCEPTFILES)
$pic = GUICtrlCreatePic("", 0, 0, 600, 440)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetState(-1, $GUI_DISABLE)
$label = GUICtrlCreateLabel('', 10, 10, 590, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 10, 800, 2, "Arial")
GUICtrlSetColor(-1, 0xff0000)
GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_DROPPED
            GUICtrlSetImage($pic, @GUI_DragFile)
            WinSetTitle($Form1, '', @GUI_DragFile)
            GUICtrlSetData($label, @GUI_DragFile)
    EndSwitch
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Код:
$pic = GUICtrlCreatePic("", 0, 110, 600, 220)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
по ширине не масштабируется же...
Мы тут задали жёсткие размеры. Как оно должно масштабироваться?

Вот ещё пример с использованием GDIPlusPic:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPIShPath.au3>
#include 'GDIPlusPic.au3'

Global $iPIC
Global $iGUI_W = 600
Global $iGUI_H = 440

$hGUI = GUICreate('Test', $iGUI_W, $iGUI_H, -1, -1, -1, $WS_EX_ACCEPTFILES)

$iInfo_Lbl = GUICtrlCreateLabel('', 10, 10, $iGUI_W - 20, 20)
GUICtrlSetFont(-1, 10, 800, 2, 'Arial')
GUICtrlSetColor(-1, 0xFF0000)

GUICtrlCreateLabel('', 0, 0, $iGUI_W, $iGUI_H)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetState(-1, $GUI_DISABLE)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_DROPPED
            If $iPIC Then
                _GDIPlusPic_Delete($iPIC)
            EndIf
            
            $sFile = @GUI_DragFile
            
            $iPIC = _GDIPlusPic_Create($hGUI, $sFile, 0, ($iGUI_H / 4), $iGUI_W, ($iGUI_H / 2))
            
            WinSetTitle($hGUI, '', _WinAPI_PathCompactPath($hGUI, $sFile, $iGUI_W - 30))
            GUICtrlSetData($iInfo_Lbl, _WinAPI_PathCompactPath(GUICtrlGetHandle($iInfo_Lbl), $sFile))
    EndSwitch
WEnd
 
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Мы тут задали жёсткие размеры. Как оно должно масштабироваться?
Может я не совсем правильно объяснил... По длине да, должно быть жестко задана. А вот ширина пусть сама вычисляется пропорционально.
 

InnI

AutoIT Гуру
Сообщения
4,573
Репутация
1,270
По длине да, должно быть жестко задана. А вот ширина пусть сама вычисляется пропорционально.
Оригинальный размер не подойдёт?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

$Form1 = GUI(600, 440)
$pic = -1

While 1
  $nMsg = GUIGetMsg()
  Switch $nMsg
    Case $GUI_EVENT_CLOSE
      Exit
    Case $GUI_EVENT_DROPPED
      _GDIPlus_Startup()
      $img = _GDIPlus_ImageLoadFromFile(@GUI_DragFile)
      $dim = _GDIPlus_ImageGetDimension($img)
      _GDIPlus_ImageDispose($img)
      _GDIPlus_Shutdown()
      If Not IsArray($dim) Then ContinueLoop
      GUIDelete($Form1)
      GUI($dim[0], $dim[1], @GUI_DragFile)
  EndSwitch
WEnd

Func GUI($W, $H, $Path = "")
  $Form1 = GUICreate("Form1", $W, $H, -1, -1, -1, $WS_EX_ACCEPTFILES)
  $pic = GUICtrlCreatePic($Path, 0, 0, $W, $H)
  GUICtrlSetState(-1, $GUI_DROPACCEPTED)
  GUISetState(@SW_SHOW)
EndFunc
 
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Оригинальный размер не подойдёт?
К сожалению нет. Должно быть именно одно небольшое окошко в которое могут перетаскивать картинки с любыми размерами по длине и ширине. А отображаться они должны по максимальной длине окошка. Не сплющенные и не вытянутые.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Тогда так:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPIShPath.au3>
#include <GDIPlus.au3>

Global $iGUI_W = 600
Global $iGUI_H = 440

$hGUI = GUICreate('_GUIPicCtrlSetImage Example', $iGUI_W, $iGUI_H, -1, -1, -1, BitOR($WS_EX_TOPMOST, $WS_EX_ACCEPTFILES))

$iInfo_Lbl = GUICtrlCreateLabel('', 10, 10, $iGUI_W - 20, 20)
GUICtrlSetFont(-1, 10, 800, 2, 'Arial')
GUICtrlSetColor(-1, 0xFF0000)

GUICtrlCreateLabel('Drag && Drop Image File Here', 0, 30, $iGUI_W, $iGUI_H - 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 10, 800, 4)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)

$iPic = GUICtrlCreatePic('', 20, 30, $iGUI_W - 40, $iGUI_H - 50, $SS_CENTERIMAGE)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_DROPPED
            $sFile = @GUI_DragFile
            
            _GUIPicCtrlSetImage($iPic, $sFile, $iGUI_H, BitOR(0xFF000000, _GUIGetBkColor($hGUI)))
            
            WinSetTitle($hGUI, '', _WinAPI_PathCompactPath($hGUI, $sFile, $iGUI_W - 30))
            GUICtrlSetData($iInfo_Lbl, _WinAPI_PathCompactPath(GUICtrlGetHandle($iInfo_Lbl), $sFile))
    EndSwitch
WEnd

Func _GUIPicCtrlSetImage($iCID, $sFile, $iWH, $iBkClr = 0xFFFFFF, $bDelBmp = True)
    Local $hBmp1, $hBitmap, $hGraphic, $hImage, $iW, $iH, $aGS[4], $hBmp2, $hOldBmp
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $IMAGE_BITMAP = 0
    
    _GDIPlus_Startup()
    $hBmp1 = _WinAPI_CreateBitmap($iWH, $iWH, 1, 32)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp1)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _WinAPI_DeleteObject($hBmp1)
    _GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr))
    $hImage = _GDIPlus_ImageLoadFromFile($sFile)
    $iW = _GDIPlus_ImageGetWidth($hImage)
    $iH = _GDIPlus_ImageGetHeight($hImage)
    
    ;Get Scale
    If $iW <= $iWH And $iH <= $iWH Then
        $aGS[2] = $iW
        $aGS[3] = $iH
        $aGS[0] = ($iWH - $aGS[2])/2
        $aGS[1] = ($iWH - $aGS[3])/2
    ElseIf $iW > $iH Then
        $aGS[2] = $iWH
        $aGS[3] = $iH/($iW/$iWH)
        $aGS[0] = 0
        $aGS[1] = ($iWH - $aGS[3])/2
    ElseIf $iW < $iH Then
        $aGS[2] = $iW/($iH/$iWH)
        $aGS[3] = $iWH
        $aGS[0] = ($iWH - $aGS[2])/2
        $aGS[1] = 0
    ElseIf $iW = $iH Then
        $aGS[2] = $iWH
        $aGS[3] = $iWH
        $aGS[0] = 0
        $aGS[1] = 0
    EndIf
    
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, $aGS[0], $aGS[1], $aGS[2], $aGS[3])
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_GraphicsDispose($hGraphic)
    $hBmp2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    
    $hOldBmp = GUICtrlSendMsg($iCID, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp2)
    
    If $hOldBmp Then
        _WinAPI_DeleteObject($hOldBmp)
    EndIf
    
    If $bDelBmp Then
        Return _WinAPI_DeleteObject($hBmp2)
    EndIf
    
    Return $hBmp2
EndFunc

Func _GUIGetBkColor($hWnd)
    Local $hDC, $iRGBColor
    
    $hDC = _WinAPI_GetDC($hWnd)
    $iRGBColor = _WinAPI_GetBkColor($hDC)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    
    Return $iRGBColor
EndFunc
 
Последнее редактирование:
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Да! Отлично! Я так понимаю, что для вертикальных картинок высчитывается по ширине, а для горизонтальных по длине? Если да, то подскажи какой параметр отвечает за такое отображение? Чтоб допустим чуть увеличить/уменьшить картинку в окне.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Я так понимаю, что для вертикальных картинок высчитывается по ширине, а для горизонтальных по длине?
Функция сохраняет пропорции в рамках указанного размера.

какой параметр отвечает за такое отображение?
Третьи параметр в вызове _GUIPicCtrlSetImage.
 
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Третьи параметр в вызове _GUIPicCtrlSetImage.
Я очень извиняюсь что туплю, но последний вопрос если можно... Почему у любых горизонтальных картинок "светлые рамки" слева и справа больше чем у любых вертикальных картинок сверху и снизу? (хотелось бы их сделать минимальными). Нужно менять только этот третий HEX параметр?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Нужно менять только этот третий HEX параметр?
Этот параметр отвечает за цвет фона, по идее должен брать цвет GUI, у меня к примеру вовсе не видно рамок.
Возможно стоит изначально задать цвет фона GUI, и использовать такой же в этом третьем параметре.
 
Автор
S

Scampy

Новичок
Сообщения
50
Репутация
0
Этот параметр отвечает за цвет фона, по идее должен брать цвет GUI, у меня к примеру вовсе не видно рамок.
Возможно стоит изначально задать цвет фона GUI, и использовать такой же в этом третьем параметре.
Я имел ввиду вот эти "рамки". Расстояние от рамки окна до самой картинки. Их как уменьшить?
 

Вложения

  • scr.jpg
    scr.jpg
    214.8 КБ · Просмотры: 9

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Код:
$iPic = GUICtrlCreatePic('', 0, 30, $iGUI_W, $iGUI_H - 50, $SS_CENTERIMAGE)

...


            _GUICtrlPicSetImage($iPic, $sFile, $iGUI_W, BitOR(0xFF000000, _GUIGetBkColor($hGUI)))
 
Верх