Ich denke mal, du musst bei LockBits den Parameter $GDIP_PXF32ARGB angeben...
E
Ich denke mal, du musst bei LockBits den Parameter $GDIP_PXF32ARGB angeben...
E
Nein, brauchst du nicht!
#cs Kommentar:
Der Quelltext geht sicherlich kürzer, allerdings habe ich jetzt keine lust, ihn zu überarbeiten
Wenn Zeit da ist, werde ich dies villt. machen
Diese Funktion läd euch ein Bild wie _GDIPlus_BitmapCreateFromFile in ein Bitmapobjekt, nur dass ihr
bestimmen könnt, welche Größe es hat. Anpassungsfähigkeit ist gegeben.
Der Zweck besteht darin, dass ein großes Bild nicht ständig wieder kleiner gezeichnet werden muss, was Vorteile hat,
besonders bei Performence. In meinem Test hatte ich statt 22-30ms nurnoch 6-10ms Zeichenzeit.
Viel Spaß damit
#ce
#include <GDIPlus.au3>
_GDIPlus_StartUp()
$hWnd = GUICreate("Beispiel Bitmap Laden", 200, 200)
GUISetState(@SW_SHOW)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$sPath = FileOpenDialog("Bild auswählen", @MyDocumentsDir, "(*.jpg)|(*.bmp)|(*.gif)|(*.png)")
$hTime = TimerInit()
$hBitmap = _GDIPlus_BitmapLoadFromFile($sPath, 200, 200, 1) ; es wird automatisch passen
; um eine feste höhe anzulegen, nehmt als letzte parameter 2 und "height", für eine feste weite einfach 2 und "widht"
WinSetTitle("Beispiel Bitmap Laden", "", Round(TimerDiff($hTime), 2) & "ms zum Laden benötigt")
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, _GDIPlus_ImageGetWidth($hBitmap), _GDIPlus_ImageGetHeight($hBitmap))
Sleep(3000)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
GUIDelete($hWnd)
Exit
; #FUNCTION# ====================================================================================================================
; Name...........: _GDIPlus_BitmapLoadFromFile
; Description ...: Erstellt ein Bitmapobjekt mit einer Spezifischen Größe
; Syntax.........: _GDIPlus_BitmapLoadFromFile($s_Path[, $i_Widht[, $i_Height[, $i_Opt]]])
; Parameters ....: $s_Path - Pfad der Bilddatei
; $i_Widht - Weite des Bitmapobjektes
; $i_Height - Höhe des Bitmapobjektes
; $i_Opt - (optional) Verhältnisse anpassen, falls gewollt (0=Nein/1=Ja/2=Fortgeschritten ; Standart = 0)
; Return values .: Sucess - Bitmapobjekt mit dem geladenen Bild
; Failure - 0 und setzt @error auf
; |1 - Dateipfad ungültig
; |2 - Option falsch gesetzt
; Author ........: black_skorpi (@autoit.de)
; Example .......: Yes
; ===============================================================================================================================
Func _GDIPlus_BitmapLoadFromFile($s_Path, $i_Widht, $i_Height, $i_Opt = 0, $s_Opt = "")
Local $hWnd=_WinAPI_GetDesktopWindow()
Local $h_Image = _GDIPlus_ImageLoadFromFile($s_Path)
If @error Then Return SetError(1, 0, 0)
Local $a_Verh[3] = [_GDIPlus_ImageGetHeight($h_Image),_GDIPlus_ImageGetWidth($h_Image),_GDIPlus_ImageGetHeight($h_Image) / _GDIPlus_ImageGetWidth($h_Image)]
If ($i_Opt <> 0) And ($i_Opt <> 1) And ($i_Opt <> 2) Then SetError(2, 0, 0)
If $i_Opt = 1 Then
If $a_Verh[2] < 1 Then
$s_Opt = "widht"
ElseIf $a_Verh[2] > 1 Then
$s_Opt = "height"
ElseIf $a_Verh[2] = 1 Then
$i_Opt = 0
EndIf
EndIf
If $i_Opt = 0 Then
Local $h_Graphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
Local $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics($i_Widht, $i_Height, $h_Graphic), $h_Buffer = _GDIPlus_ImageGetGraphicsContext($h_Bitmap)
_GDIPlus_GraphicsDrawImageRectRect($h_Buffer, $h_Image, 0, 0, $a_Verh[0], $a_Verh[1], 0, 0, $i_Widht, $i_Height)
Else
Switch $s_Opt
Case "widht"
Local $h_Graphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
Local $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics($i_Widht, $i_Widht * $a_Verh[2], $h_Graphic), $h_Buffer = _GDIPlus_ImageGetGraphicsContext($h_Bitmap)
_GDIPlus_GraphicsDrawImageRectRect($h_Buffer, $h_Image, 0, 0, $a_Verh[1], $a_Verh[0], 0, 0, $i_Widht, $i_Widht * $a_Verh[2])
Case "height"
Local $h_Graphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
Local $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics($i_Height / $a_Verh[2], $i_Height, $h_Graphic), $h_Buffer = _GDIPlus_ImageGetGraphicsContext($h_Bitmap)
_GDIPlus_GraphicsDrawImageRectRect($h_Buffer, $h_Image, 0, 0, $a_Verh[1], $a_Verh[0], 0, 0, $i_Height / $a_Verh[2], $i_Height)
EndSwitch
EndIf
_GDIPlus_GraphicsDispose($h_Graphic)
_GDIPlus_GraphicsDispose($h_Buffer)
_GDIPlus_ImageDispose($h_Image)
Return $h_Bitmap
EndFunc
Du könntest noch diese Funktionen einbinden:
[autoit]_GDIPlus_GraphicsSetSmoothingMode($h_Buffer, 2)
DllCall($ghGDIPDll, "int", "GdipSetInterpolationMode", "handle", $h_Buffer, "int", 7)
Damit wird das Bild schöner verkleinert
E
praktische Funktion!
Um dein Bitmap ohne GUI zu erstellen kannst du das machen:
[autoit]_GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
[/autoit]E
Ich würde ein Label "unter" der GDI+ Grafik erstellen.
Damit funktioniert das Script genauso, als würdest du Buttons benutzen:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global Const $SS_OWNERDRAW = 0x0000000D
[/autoit] [autoit][/autoit] [autoit]Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $hGui = GUICreate("Test", 300, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(300, 200, $hGraphics)
Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
_GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
Global $hPen = _GDIPlus_PenCreate(0xFFFFFF00)
Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF0000FF)
_GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)
[/autoit] [autoit][/autoit] [autoit]Global $cLabel1 = GUICtrlCreateLabel("", 50, 50, 100, 30, $SS_OWNERDRAW)
GUICtrlSetOnEvent($cLabel1, "_Button")
_GDIPlus_GraphicsFillRect($hGfxBuffer, 50, 50, 100, 30, $hBrush)
_GDIPlus_GraphicsDrawRect($hGfxBuffer, 50, 50, 100, 30, $hPen)
Global $cLabel2 = GUICtrlCreateLabel("", 50, 100, 100, 30, $SS_OWNERDRAW)
GUICtrlSetOnEvent($cLabel2, "_Button")
_GDIPlus_GraphicsFillRect($hGfxBuffer, 50, 100, 100, 30, $hBrush)
_GDIPlus_GraphicsDrawRect($hGfxBuffer, 50, 100, 100, 30, $hPen)
GUIRegisterMsg($WM_PAINT, "WM_PAINT")
GUISetState()
While 1
Sleep(100)
WEnd
Func _Button()
Switch @GUI_CtrlId
Case $cLabel1
MsgBox(0, "", "Button 1 wurde gedrückt")
Case $cLabel2
MsgBox(0, "", "Button 2 wurde gedrückt")
EndSwitch
EndFunc ;==>_Button
Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
_GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_PAINT
Func _Exit()
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_PenDispose($hPen)
_GDIPlus_GraphicsDispose($hGfxBuffer)
_GDIPlus_BitmapDispose($hBmpBuffer)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_Exit
Edit: Das geht natürlich auch mit der GuiGetMsg-Methode!
E
Uuups, verpennt ...
Me too...
Er wirds aber eh nicht merken, da er wahrscheinlich noch immer am Feiern ist
Alles Gute!!!
E
$exititem und label 9 haben die gleiche ID...
[autoit]TraySetOnEvent($exititem, "_beenden")
[/autoit]Edit: Sorry, war wohl etwas zu schnell
So gehts nämlich nicht
Herzlichen Glückwunsch, dem King of Array!
Der Parameter -vn gilt nur wenn du eine MP3 haben willst
Hab hier ein paar Koordinate für dich zum debuggen:
Global $aDrag[5][2] = [[0, 0],[140, 99],[554, 99],[750, 350],[99, 454]]
Global $aDrag[5][2] = [[0, 0],[135, 108],[698, 154],[698, 347],[99, 454]]
Global $aDrag[5][2] = [[0, 0],[91, 242],[696, 172],[705, 447],[91, 314]]
Global $aDrag[5][2] = [[0, 0],[35, 107],[693, 79],[715, 434],[89, 461]]
Global $aDrag[5][2] = [[0, 0],[587, 67],[693, 79],[715, 434],[89, 461]]
Zu verwenden mit dem Bild Logo4.gif aus dem Autoit\Examples\Gui -Ordner
1) sollte selbsterklärend sein
2) Bild ist schwarz, linke Punkte können bewegt werden - Bild bleibt schwarz
3) Bild ist schwarz, rechte Punkte können bewegt werden - Bild bleibt schwarz
4) Bild scheint generell etwas zu hoch zu sitzen, es ragt über die obernen Punkte hinaus (bzw ist abgeschnitten) und hat zu den unteren Punkten Luft
5) Komisches Eck links unten
E
Noch die Zeile um immer gleich die Koordinaten zu bekommen:
[autoit]ConsoleWrite("Global $aDrag[5][2] = [[0, 0],[" & $aDrag[1][0] & ", " & $aDrag[1][1] & "],[" & $aDrag[2][0] & ", " & $aDrag[2][1] & "],[" & $aDrag[3][0] & ", " & $aDrag[3][1] & "],[" & $aDrag[4][0] & ", " & $aDrag[4][1] & "]]" & @CRLF)
[/autoit]
In die Hauptschleife in Switch/Else
GROSSARTIG
Oh Mann - ich bin ganz aufgeregt
Wie ist es, wenn du $GDIP_ILMUSERINPUTBUF bei BitLock benutzt?
wird dann auch eine Kopie erstellt?! vielleicht geht das ja schneller...
2 Bugs sind mir aufgefallen:
1) konnte ich leider nicht mehr reproduzieren, als ich die Koordinaten der Eckpunkte auslesen wollte, aber manchmal ist das Bild einfach nur schwarz.
Verschiebt man einen Punkt etwas, dann ist das Bild wieder da - wieder zurück ist es wieder weg...
2) siehe Screenshot: autoit.de/wcf/attachment/11884/
ps.: Du includest in deinen ASM-Scripts immer die Datei GDIConstants.au3, welche aber standartmässig nicht bei AutoIt dabei ist.
Sieht beeindruckend aus!
Allerdings ist 23MB doch etwas groß...
Du könntest das Video als "richtige" Videodatei beilegen (z.B.: DivX kodiert) und bei Scriptstart die einzelnen Bilder mit ffmpeg extrahieren.
das würde weniger Speicher benötigen.
Das wär zumindest einen Versuch wert
E
Ich hab leider keine Ahnung, wie man Joint-Stereo einstellt!
zumindest Stereo, falls mp4 mono ist, geht mit "-ac 2"
Die Zeile sollte so funktionieren:
"-vn" = disable video, da mp4 wahrscheinlich auch Videodaten enthält...
Du könntest auch zunächst in Wav umwandeln und dann lame.exe um eine MP3 daraus zu machen - dann hast du sicher Joint Stereo!
E
Beim Super Mario Spiel hab ich das so gelöst:
Backbuffer hat immer dieselbe Größe
Wenn neu gezeichnet werden soll, dann sende ich via _WinApi_RedrawWindow eine $WM_ERASEBKGND-Message - dadurch wird:
_WM_ERASEBKGND($hWnd, $uMsg, $wParam, $lParam) aufgerufen; §wParam = DC-Handle
Dann kann ich mit _GDIPlus_GraphicsCreateFromHDC($wParam) und _GDIPlus_GraphicsDrawImageRect den Backbuffer in der gewünschten Größe zeichnen
Das macht natürlich nur Sinn, wenn sich der grafische Inhalt proportional mit dem Fenster vergrößern soll!
E
Der Parameter für die Audiobitrate ist -ab
Die Samplerate würde ich nicht angeben (wäre außerdem -ar), denn resamplen bedeutet auch einen (kleinen) Qualitätsverlust
Man könnte noch den Parameter -aq (=audio quality) anwenden
Da weiß ich aber nicht auswendig, welche Werte die bessere Qualität bedeuten - steht sicher wo im www geschrieben
bessere Qualität heißt, daß der Encoder bessere Algo´s verwendet - Berechnung dauert daher länger...
E
... eukalyptus
Kannst du mir helfen?^^ (Ich sah nur: Tontechniker)
Was gibt´s?
Falls du die von name22 gepostete Variante mit dem Path anwenden möchtest, dann könntest du auch folgendes probieren:
_Gdiplus_PathAddString ohne irgendwelche X-Y Einstellungen vorzunehmen
mit _Gdiplus_PathGetWorldBounds bekommst du X,Y,W,H vom Path
Mit einer Matrix (_gdiplus_matrixcreate, _gdiplus_matrixtranslate und _gdiplus_pathtransform)
kannst du dann den Schriftzug an die gewünschte Position verschieben und dann zeichnen
E
Edit: und da ich grad Lust hatte, hab ich auch ein Beispiel erstellt:
Die Farben des Bildes, die später unter dem Schriftzug liegen, werden ausgelesen und davon der durchschnittliche Lumawert ausgerechnet
Wenn dieser größer als 100, dann wird eine schwarze Scrift erstellt, sonst eine weiße.
Dieser Schritt benötigt natürlich Zeit und kann auch deaktiviert werden, wenns Schneller gehen soll
#include <GDIP.au3>
#include <Color.au3>
_GDIPlus_Startup()
$hFormat = _GDIPlus_StringFormatCreate()
$hFamily = _GDIPlus_FontFamilyCreate("Arial")
$tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
$hBrush = _GDIPlus_BrushCreateSolid(0x6600FF00)
$hPen = _GDIPlus_PenCreate(0xFF000000, 2)
Global $FileSearch = FileFindFirstFile(@ScriptDir & "\source\*.jpg")
If $FileSearch = -1 Then Exit
Local $file
While 1
$file = FileFindNextFile($FileSearch)
If @error Then ExitLoop
_Losung_Bild(@ScriptDir & "\source\" & $file)
WEnd
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_PenDispose($hPen)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_Shutdown()
Func _Losung_Bild($file, $sText = "abc")
Local $hImage = _GDIPlus_ImageLoadFromFile($file)
Local $hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
_GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
Local $iWidth = _GDIPlus_ImageGetWidth($hImage)
Local $iHeight = _GDIPlus_ImageGetHeight($hImage)
Local $hPath = _GDIPlus_PathCreate()
_GDIPlus_PathAddString($hPath, $sText, $tLayout, $hFamily, 0, 50, $hFormat)
Local $aBounds = _GDIPlus_PathGetWorldBounds($hPath)
[/autoit] [autoit][/autoit] [autoit]Local $hMatrix = _GDIPlus_MatrixCreate()
_GDIPlus_MatrixTranslate($hMatrix, $iWidth - $aBounds[0] - $aBounds[2] - 10, $iHeight - $aBounds[1] - $aBounds[3] - 40)
_GDIPlus_PathTransform($hPath, $hMatrix)
_GDIPlus_MatrixDispose($hMatrix)
[/autoit] [autoit][/autoit] [autoit]Switch _BildHelligkeit($hImage, $hPath)
Case 0
_GDIPlus_BrushSetSolidColor($hBrush, 0x66FFFFFF)
_GDIPlus_PenSetColor($hPen, 0xFFFFFFFF)
Case Else
_GDIPlus_BrushSetSolidColor($hBrush, 0x66000000)
_GDIPlus_PenSetColor($hPen, 0xFF000000)
EndSwitch
_GDIPlus_GraphicsFillPath($hGraphics, $hPath, $hBrush)
_GDIPlus_GraphicsDrawPath($hGraphics, $hPath, $hPen)
_GDIPlus_PathDispose($hPath)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_ImageSaveToFile($hImage, StringTrimRight($file, 4) & "_Text.jpg")
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_ImageDispose($hImage)
EndFunc ;==>_Losung_Bild
Func _BildHelligkeit($hBitmap, $hPath)
Local $aBounds = _GDIPlus_PathGetWorldBounds($hPath)
Local $BitmapData = _GDIPlus_BitmapLockBits($hBitmap, $aBounds[0], $aBounds[1], $aBounds[2], $aBounds[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
Local $Stride = DllStructGetData($BitmapData, "Stride")
Local $Width = DllStructGetData($BitmapData, "Width")
Local $Height = DllStructGetData($BitmapData, "Height")
Local $Scan0 = DllStructGetData($BitmapData, "Scan0")
Local $PixelData, $Color, $Luma = 0, $iCnt = 0
For $row = 0 To $Height - 1
$PixelData = DllStructCreate("dword[" & $Width & ']', $Scan0 + ($row * $Stride))
For $col = 0 To $Width - 1
If _GDIPlus_PathIsOutlineVisiblePoint($hPath, $aBounds[0] + $col, $aBounds[1] + $row) Then
$iCnt += 1
$Color = DllStructGetData($PixelData, 1, $col + 1)
$Luma += _ColorGetRed($Color) * 0.3 + _ColorGetGreen($Color) * 0.59 + _ColorGetBlue($Color) * 0.11
EndIf
Next
Next
_GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)
$Luma /= $iCnt
If $Luma > 100 Then Return 1
Return 0
EndFunc ;==>_BildHelligkeit
Ruf ffmpeg mal so auf:
ffmpeg.exe -h > ffmpeg.txt
und:
ffmpeg.exe -formats > formats.txt
dann hast du 2 Dateien, die dir vielleicht etwas weiterhelfen können...
Edit:
habs schnell mal probiert: ohne Parameter hat die mp4-Datei eine Audiobitrate von 64k
wenn du die Bitrate raufsetzt, dann ist auch das Ergebnis besser:
-ab 128k
#include <GDIPlus.au3>
#include <WinAPI.au3>
Opt('MustDeclareVars', 1)
_Main()
[/autoit] [autoit][/autoit] [autoit]Func _Main()
Local $hGUI, $hGraphic, $hPen, $hEdit, $hDC
$hGUI = GUICreate("GDI+", 400, 200)
$hEdit = GUICtrlCreateEdit("", 30, 30, 340, 70, 0x08000000)
GUISetState()
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($hEdit))
$hPen = _GDIPlus_PenCreate(0xFF0000FF)
_GDIPlus_GraphicsDrawLine($hGraphic, 10, 10, 50, 50, $hPen)
Do
Until GUIGetMsg() = -3
_GDIPlus_PenDispose($hPen)
_GDIPlus_GraphicsDispose($hGraphic)
_WinAPI_ReleaseDC($hGUI, $hDC)
_GDIPlus_Shutdown()
EndFunc ;==>_Main
evtl. haben nicht alle Verionen von FFMpeg den gleichen Output - dann musst du die Funktionen etwas anpassen...
#include <Date.au3>
[/autoit] [autoit][/autoit] [autoit]$sStdErr = ""
$iTicksDuration = 0
$iTicksTime = 0
ProgressOn("FFMpeg", "FFMpeg")
[/autoit] [autoit][/autoit] [autoit]$hPid = Run(@ScriptDir & '\ffmpeg.exe -y -i test.wav -ab 128k -ar 44100 test.mp3', @ScriptDir, @SW_HIDE, 4)
While 1
$sStdErr &= StderrRead($hPid)
If @error Then ExitLoop
If StringLen($sStdErr) > 0 Then
If Not $iTicksDuration Then $iTicksDuration = _GetDuration($sStdErr)
$iTicksTime = _GetTime($sStdErr)
If Not @error Then $sStdErr = ""
ProgressSet($iTicksTime * 100 / $iTicksDuration)
EndIf
WEnd
ProgressOff()
Func _GetDuration($sStdErr)
If Not StringInStr($sStdErr, "Duration:") Then Return SetError(1, 0, 0)
Local $aRegExp = StringRegExp($sStdErr, "(?i)Duration.+?([0-9:]+)", 3)
If @error Or Not IsArray($aRegExp) Then Return SetError(1, 0, 0)
Local $sTime = $aRegExp[UBound($aRegExp) - 1]
Local $aTime = StringSplit($sTime, ":", 2)
If @error Or Not IsArray($aTime) Then Return SetError(1, 0, 0)
Return _TimeToTicks($aTime[0], $aTime[1], $aTime[2])
EndFunc ;==>_GetDuration
Func _GetTime($sStdErr)
If Not StringInStr($sStdErr, "time=") Then Return SetError(1, 0, "")
Local $aRegExp = StringRegExp($sStdErr, "(?i)time=\h*([0-9]+)", 3)
If @error Or Not IsArray($aRegExp) Then Return SetError(1, 0, "")
Local $sTime = $aRegExp[UBound($aRegExp) - 1]
Return _TimeToTicks(0, 0, $sTime)
EndFunc ;==>_GetTime