Ich hätte gerne mehr Waffen!
Beiträge von Romanow
-
-
Danke!
Nächste Woche teste ich es.
Vielleicht lässt sich daraus eine gute GUI Übungsaufgabe für die Azubis machen.
Schrittmotor GUI erstellen oder so ähnlich. -
Ich habe den Fehler in der Exceltabelle gefunden.
Es wurde bereits mit Excel 2013 die gleichen IDs farbig Markiert.
Mit STRG+A wählt man die Tabelle aus mit Rechtsklick auf Schnellanalyse und da wurde "Doppelte Werte" ausgewählt, das muss rückgängig gemacht werden.
Es handelt sich um keine normale Formatierung, diese lässt sich nicht über die Formatierung löschen. -
-
-
Ich darf hier keine xlsx hochladen, deshalb die zip mit der Excel & Script
Hab das Programm auf das wesentlich zusammengestrichen.
Ich verwende Excel 2003 & 2013
AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <StringConstants.au3> #include <File.au3> #include <GuiButton.au3> #include <WindowsConstants.au3> #include <GUIConstants.au3> #include <Misc.au3> #include <Sound.au3> #include <Array.au3> #include <Excel.au3> local $sDir = @ScriptDir & "\ID_LIST.xlsx" GUICreate("Scanner", @DesktopWidth*0.9, @DesktopHeight*0.9, $WS_EX_ACCEPTFILES) GUICtrlCreateLabel("LPN Nummer:", 5, 80, 350, 60) GUICtrlSetFont(-1,32) Local $idLPN = GUICtrlCreateEdit("LPN000000000000", 350, 80, 400, 60,BitOR($ES_WANTRETURN,$ES_AUTOVSCROLL)) ; Muss ein Edit sein damit die Entererkennung funktioniert! GUICtrlSetFont(-1,32) Local $idBtn = GUICtrlCreateButton("SUCHEN", 800, 80, 200, 60) GUICtrlSetFont(-1,32) Local $diBeschreibung = GUICtrlCreateLabel("", 5, 180, (@DesktopWidth*0.9)-180, (@DesktopHeight*0.9)-5) GUICtrlSetFont(-1, 56, 400, 0, "Calibri", 5) ; Create application object and open an example workbook Local $oExcel = _Excel_Open() If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $oWorkbook = _Excel_BookOpen($oExcel, $sDir) If @error Then MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error opening workbook '" & $sDir & @CRLF & "@error = " & @error & ", @extended = " & @extended) _Excel_Close($oExcel) Exit EndIf GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _Excel_Close($oExcel) ExitLoop Case $idBtn Suchen() EndSwitch WEnd func Suchen() $idLPN_NR = GUICtrlRead($idLPN) Local $aResult = _Excel_RangeFind($oWorkbook, $idLPN_NR,"A1:A10000",$xlValues) local $sResult_1_Text Local $aResult_1 _ArrayDisplay($aResult) ;<- DEBUG for $i = 0 to UBound($aResult)-1 $aResult_Text_1 = StringReplace($aResult[$i][2],"A","D") $aResult_1 = _Excel_RangeRead($oWorkbook, Default, $aResult[$i][2] & ":" & $aResult_Text_1, 1) $sResult_1_Text = $sResult_1_Text &"Beschreibung " & $i+1 & " "& _ArrayToString($aResult_1) & @CRLF next GUICtrlSetData($diBeschreibung,$sResult_1_Text) EndFunc
-
Guten Tag liebe Autoit Gemeinde,
ich bin auf folgendes Problem gestoßen, vielleicht stand schon jemand von euch vor dem selben Problem.
Das Programm sucht aus einer Exceltabelle (aktuell 8100 Zeilen lang und 4 Breit Bereich A1:D8100)
In der ersten Spalte steht die ID, der Bereich in dem gesucht wird lautet A1:A10000 (Nicht A8100 weil die Tabelle pro Woche um 150-300 Zeilen länger wird)$idLPN_NR = Zu Suchender String - ca 14 chars lang +/- 3
Local $aResult = _Excel_RangeFind($oWorkbook, $idLPN_NR,"A1:A10000",$xlValues)
Ich benötige die Information z.B
A10
A1796
A:242
Eine ID kann mehrfach in dieser Exceltabelle vorhanden sein!Daraus mache ich
A10:D10
A1796:D1796
A3242:D3242
Um mir die benötigten Informationen anzeigen zu lassen. Das geht super schnell.Das dauert aktuell leider 7 Sekunden, ich benötige das aber in unter 1 Sekunde
Hat jemand eine Idee wie das schneller gehen könnte?
Ich liebäugle gerade mit ClipPut und ClipGet mit StringCompare was zu basteln....
Ich verwende die Excel.au3 der AutoIt Version : 3.3.15.0 mit zwei Anpassungen
$aResult[$iIndex][1] =$oMatch.Name.Name
Macht folgenden Fehler
\AutoIt3\Include\Excel.au3" (656) : ==> The requested action with this object has failed.:
Geändert in -> $aResult[$iIndex][1] = 0;$oMatch.Name.Name$aResult[$iIndex][5] = $oMatch.Comment.Text
Macht folgenden Fehler
\AutoIt3\Include\Excel.au3" (660) : ==> The requested action with this object has failed.:Geändert in -> $aResult[$iIndex][5] = 0;$oMatch.Comment.Text
Code
Alles anzeigenFunc _Excel_RangeFind($oWorkbook, $sSearch, $vRange = Default, $iLookIn = Default, $iLookAt = Default, $bMatchcase = Default) If Not IsObj($oWorkbook) Or ObjName($oWorkbook, 1) <> "_Workbook" Then Return SetError(1, 0, 0) If StringStripWS($sSearch, 3) = "" Then Return SetError(2, 0, 0) If $iLookIn = Default Then $iLookIn = $xlValues If $iLookAt = Default Then $iLookAt = $xlPart If $bMatchcase = Default Then $bMatchcase = False Local $oMatch, $sFirst = "", $bSearchWorkbook = False, $oSheet If $vRange = Default Then $bSearchWorkbook = True $oSheet = $oWorkbook.Sheets(1) $vRange = $oSheet.UsedRange ElseIf IsString($vRange) Then $vRange = $oWorkbook.Activesheet.Range($vRange) If @error Then Return SetError(3, @error, 0) EndIf Local $aResult[100][6], $iIndex = 0, $iIndexSheets = 1 While 1 $oMatch = $vRange.Find($sSearch, Default, $iLookIn, $iLookAt, Default, Default, $bMatchcase) If @error Then Return SetError(4, @error, 0) If IsObj($oMatch) Then $sFirst = $oMatch.Address While 1 $aResult[$iIndex][0] = $oMatch.Worksheet.Name $aResult[$iIndex][1] = 0;$oMatch.Name.Name $aResult[$iIndex][2] = $oMatch.Address $aResult[$iIndex][3] = $oMatch.Value $aResult[$iIndex][4] = $oMatch.Formula $aResult[$iIndex][5] = 0;$oMatch.Comment.Text $iIndex = $iIndex + 1 If Mod($iIndex, 100) = 0 Then ReDim $aResult[UBound($aResult, 1) + 100][6] $oMatch = $vRange.Findnext($oMatch) If Not IsObj($oMatch) Or $sFirst = $oMatch.Address Then ExitLoop WEnd EndIf If Not $bSearchWorkbook Then ExitLoop $iIndexSheets = $iIndexSheets + 1 $sFirst = "" $oSheet = $oWorkbook.Sheets($iIndexSheets) If @error Then ExitLoop $vRange = $oSheet.UsedRange WEnd ReDim $aResult[$iIndex][6] Return $aResult EndFunc ;==>_Excel_RangeFind
-
Ich könnte das so nicht auf Autoit übertragen.
-
Danke für den Tipp mit der Ausgabe.
Hab das Problem so gelöst, ich werde das Morgen schön in das Programm einbauen.
AutoIt
Alles anzeigen#include <Constants.au3> While 1 Sleep(1000) $sString = _CMDRead_WiFi_Signal("netsh wlan show networks mode=bssid >> " & @ScriptDir & "\temp.txt") ConsoleWrite($sString & @CRLF) WEnd Func send_cmd($CMD) RunWait(@ComSpec & " /c " & $CMD, @SystemDir, @SW_HIDE, $STDOUT_CHILD) EndFunc ;==>send_cmd Func _CMDRead_WiFi_Signal($command) send_cmd($command) $sFilePath = "temp.txt" Local $hFileOpen = FileOpen($sFilePath, $FO_READ) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred when reading the file.") Return False EndIf Local $sFileRead = FileRead($hFileOpen) FileClose($hFileOpen) $CMDRead_Start = StringInStr($sFileRead, "Signal :") ; Nach % Suchen $sFileRead = StringMid($sFileRead, $CMDRead_Start + 20, 4) ; 3 Zeichen nach links zurück und 4 Zeichen danach ausgeben 99% als beispiel. Return SetError(@error, @extended, $sFileRead) EndFunc ;==>_CMDRead_WiFi_Signal
-
Guten Abend,
der Skript soll die WiFi Signalstärke vom Laptop in % ausgeben.
Leider bin ich auf ein Problem gestoßen und komme nicht mehr weiter.
Dieser Skript funktioniert so weit, nur bleibt er willkürlich (vermutlich) hier stehen.
Der Skrtip zum debuggen. ~ Nach etwa 5 Minuten ist er zu 99% in der Endlosschleife.
Zeile 14 ist nur ein verzweifelter versuch gewesen das Problem zu lösen.AutoIt
Alles anzeigen#include <Constants.au3> While 1 Sleep(1000) $sString = _CMDRead_WiFi_Signal("netsh wlan show networks mode=bssid") ConsoleWrite("1" & $sString & @CRLF) WEnd Func _CMDRead_WiFi_Signal($command) Local $CMDRead $CMD = Run(@ComSpec & " /c " & $command, @SystemDir, @SW_HIDE, $STDOUT_CHILD) ConsoleWrite("2" & @CRLF) If @error Then SetError(@error, @extended, 0) ConsoleWrite("3" & @CRLF) While 1 $CMDRead &= StdoutRead($CMD) ;ConsoleWrite("ERROR") If @error Then ExitLoop WEnd ConsoleWrite("4" & @CRLF) $CMDRead_Start = StringInStr($CMDRead, "%") ; Nach % Suchen $CMDRead = StringMid($CMDRead, $CMDRead_Start - 3, 4) ; 3 Zeichen nach links zurück und 4 Zeichen danach ausgeben 99% als beispiel. ;Return ($CMDRead) Return SetError(@error, @extended, $CMDRead) EndFunc ;==>_CMDRead_WiFi_Signal
-
Ja es geht, hab Autoit auf dem Odys X9 laufen.
-
Hab das Problem gefunden.
In der Funktion _PIC_scale muss der Ordner mit den Minibildern immer vorher gelöscht werden, da er sonst die alte Minibilderauflösung verwendet.
DirRemove("Album rescale\")AutoIt
Alles anzeigenFunc _PIC_scale($iAlbum_Folder) Local $hBitmap1, $hImage1, $hGraphics Local $width_resize = GUICtrlRead($idwidth) Local $height_resize = GUICtrlRead($idwidth) _GDIPlus_Startup() DirRemove("Album rescale\") DirCreate("Album rescale\") $iFilelist_PIC = _FileListToArray($iAlbum_Folder, "*.jpg") For $j = 1 To $iFilelist_PIC[0] $hBitmap1 = $iAlbum_Folder & $iFilelist_PIC[$j] ;MsgBox(0, "TEST", $hBitmap1) $hImage = _GDIPlus_BitmapCreateFromFile($hBitmap1) $hImage_rescale = _GDIPlus_ImageResize($hImage, $width_resize, $height_resize) $hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage_rescale) $sSave_mini_Image = @ScriptDir & "\Album rescale\" & $iFilelist_PIC[$j] _GDIPlus_ImageSaveToFile($hImage_rescale, $sSave_mini_Image) GUICtrlSetData($label_Progress,"Bild wird neu skaliert " & $sSave_mini_Image) _GDIPlus_ImageDispose($hImage1) _WinAPI_DeleteObject($hBitmap1) If @error Then ConsoleWrite("ERROR " & @error & @CRLF) EndIf Next _GDIPlus_Shutdown() ;Return ("Album rescale\") EndFunc ;==>_PIC_scale
-
Das Valentinsgeschenk ist sehr gut angekommen.
Die Druckqualität am DM Druckerautomaten ist unerwartet gut gewesen. Bei einer Auflösung von 6400x8768 ist bei einer Minibildauflösung von 64x64 auf 30x20cm Fotodruck alles gut erkennbar.
Hab noch ein paar Sachen eingebaut.
Neues in Version 1.1
- Das generieren dauert nur noch wenige Sekunden, THX @ UEZ!
- Neue Option "Keine identischen Bilder nebeneinander"
- Die Minibilder haben jetzt können jetzt gedreht oder gespiegelt eingesetzt werden
- Menü flackert nicht mehr
- Auflösung der Ausgabe wird angezeigt
- Paar BugfixesToDo
- Schöneres GUI erstellen
- Minibilder in Format 2:3 3:2 erlauben (Aktuell leider nur 1:1)
- Neue Option Keine identischen Bilder übereinander!
- Quellcode einheitlich machen und aufräumen.
- Der Bildspeicher wird immer noch nicht vernünftig freigegeben -
Guten Tag,
vor einigen Monaten habe ich mit autoit angefangen und schreibe seit dem funktionale(*) Programme für den Alltag.
*Umschreibung für unübersichtliche Codewurst die ich in meiner Freizeit schnell schreibe.Was macht das Programm?
Das Programm erzeugt aus ganz vielen kleinen Bildern ein großes ganzes Bild.
Programmablauf
- Ein Hauptbild wird ausgewählt welches von weitem erkennbar sein soll (sollte so 128x128 sein Seitenformat ist egal)
- Als Vorlage wird ein Album mit jpg Fotos ausgewählt (Seitenformat sollte 1 zu 1 sein)
- Das Album wird auf eine vom Benutzer vorgegebene Größe skaliert (Aktuell 64x64) und unter Album rescale gespeichert
- Jeder Pixel und Position des Hauptbild wird zwischen gespeichert und wird durch ein kleines zufälligtes Foto aus dem Album rescale neu zusammengesetzt
- jedes Kleine Foto bekommt eine Umrandung der jeweiligen ermittelten Pixelfarbe. Transparenz und Dicke der Umrandung lässt sich einstellen
- zusätzlich lässt sich jedes kleine Bild mit der jeweiligen ermittelten Farbe und einer Transparenz einfärben, von weiten sieht es einfach besser aus.Warum das ganze?
Die Grundidee habe ich aus einem Foto, dass ich mal über Whatsapp bekommen habe. (Kann ich aus Jugendschutzgründen nicht posten)
Mein Ziel ist es für Valentinstag eine große Pärchen Fotocollage zu erstellen und auf Leinwand,Poster oder Foto zu bringen.Probleme
Bei einem Hauptbild mit 128x128 Pixel wird jeder Pixel mit 64x64 Bildern aufgefüllt.
Die Ausgabe hat eine Auflösung von 8192x8192. (128*64) als jpg ca 8MB weshalb ich das hier nur verkleinert hochladen konnte.
Keine Ahnung ob sich so etwas überhaupt als Poster in A4 oder A3 in einer vernünftigen DPI ausdrucken lässt, vielleicht hat jemand von euch Ideen und Anregungen Hab noch bis Dienstag Zeit.Luxusproblem: Das Programm ist relativ lahm und braucht für die o.g Auflösung ca 2 Minuten.
Paar Beispiele
GUI:
Beispiel.jpgAusgabe: (50% skaliert)
1.jpgEtwas näher dran. (auch 50% skaliert)
2.jpgWenn ich was Zeit finde mach ich den Code vorzeigbar und veröffentliche den bei Interesse auch hier.
EDIT 2
Neues in Version 1.1
- Das generieren dauert nur noch wenige Sekunden, THX @ UEZ!
- Neue Option "Keine identischen Bilder nebeneinander"
- Die Minibilder haben jetzt können jetzt gedreht oder gespiegelt eingesetzt werden
- Menü flackert nicht mehr
- Auflösung der Ausgabe wird angezeigt
- Paar BugfixesDoTo
- Schöneres GUI erstellen
- Minibilder in Format 2:3 3:2 erlauben (Aktuell leider nur 1:1)
- Keine identischen Bilder übereinander!
- Quellcode einheitlich machen und aufräumen.AutoIt
Alles anzeigen#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_UseX64=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <GDIPlus.au3> ;Für _GDIPlus_Startup() notwendig, Bildmanipulation! #include <Timers.au3> ; Für _Timer_Init() notwendig,Anzeige der Dauer in Sekunden #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <Array.au3> #include <File.au3> #include <WinAPI.au3> Opt("GUIOnEventMode", 1) ; Wird für GUICtrlSetOnEvent benoetigt! Local $hGUI = GUICreate("PIC in PIC Generator", 600, 600) ;,BitOR($WS_HSCROLL,$WS_VSCROLL)) Global $idSlider_Filter_Transparenz = GUICtrlCreateSlider(10, 300, 200, 20) GUICtrlSetLimit(-1, 255, 0) ; change min/max value GUICtrlSetData(-1, 79) Global $idLabel_Filter_Transparenz = GUICtrlCreateLabel("Filter Transparenz", 210, 300, 100, 30) Global $idCheckbox_SamePicture = GUICtrlCreateCheckbox("Identische Bilder nebeneinander erlauben?", 10, 230, 250, 20) Global $idRadio_No_Rotation = GUICtrlCreateRadio("Keine Rotation", 350, 240, 120, 20) GUICtrlSetState(-1, $GUI_CHECKED) Global $idRadio_Rotation = GUICtrlCreateRadio("Mit zufälliger Rotation", 350, 270, 120, 20) Global $idRadio_Mirror = GUICtrlCreateRadio("Zufälliges Spiegeln", 350, 300, 120, 20) Global $idSlider_Frame_width = GUICtrlCreateSlider(500, 350, 100, 20) GUICtrlSetLimit(-1, 32, 0) ; change min/max value GUICtrlSetData(-1, 5) Global $idLabel_Frame_width = GUICtrlCreateLabel("Frame breite in Pixel", 350, 350, 100, 30) Global $idSlider_Frame_Transparenz = GUICtrlCreateSlider(10, 350, 200, 20) GUICtrlSetLimit(-1, 255, 0) ; change min/max value GUICtrlSetData(-1, 127) Global $idLabel_Frame_Transparenz = GUICtrlCreateLabel("Frame Transparenz", 210, 350, 100, 30) Local $idwidth = GUICtrlCreateInput("64", 10, 380, 40, 20) GUICtrlCreateLabel("Breite x Hoehe in Pixel", 60, 385, 100, 30) Local $idLabel_Outputresolution = GUICtrlCreateLabel(" Aufloesung der Ausgabe = ", 160, 385, 500, 30) Local $label_Vorlage = GUICtrlCreateLabel("", 0, 400, 300) ; first cell 70 width Local $idFile = GUICtrlCreateInput(@ScriptDir & "\Vorlage\vorlage.png", 0, 420, 400, 30) Local $idBtnOpenFile = GUICtrlCreateButton("Vorlage auswählen [oeFFNEN]", 410, 420, 190, 30) Local $label_Album = GUICtrlCreateLabel("", 0, 440, 300) ; first cell 70 width Local $idFile_Album = GUICtrlCreateInput(@ScriptDir & "\Album\", 0, 460, 400, 30) Local $idBtnOpenFile_Album = GUICtrlCreateButton("Album auswählen [oeFFNEN]", 410, 460, 190, 30) $BtnGen = GUICtrlCreateButton("Generieren", 0, 510, 400, 30) Local $idProgressbar1 = GUICtrlCreateProgress(20, 550, 560, 20) Local $label_Progress = GUICtrlCreateLabel("ERROR", 0, 580, 580) ; first cell 70 width GUISetState(@SW_SHOW) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUICtrlSetOnEvent($BtnGen, "Bild_Zusammenbauen") GUICtrlSetOnEvent($idBtnOpenFile, "SelectFileVorlage") GUICtrlSetOnEvent($idBtnOpenFile_Album, "SelectFileAlbum") Local $sSlider_Transparenz_old, $sSlider_Filter_Transparenz_old, $idSlider_Frame_width_old While 1 Sleep(30) If $sSlider_Transparenz_old <> GUICtrlRead($idSlider_Frame_Transparenz) Then GUICtrlSetData($idLabel_Frame_Transparenz, "Frame Transparenz " & $idSlider_Frame_Transparenz & "/" & 255 & " HEX 0x" & Hex(GUICtrlRead($idSlider_Frame_Transparenz), 2)) EndIf $sSlider_Transparenz_old = GUICtrlRead($idSlider_Frame_Transparenz) If $sSlider_Filter_Transparenz_old <> GUICtrlRead($idSlider_Filter_Transparenz) Then GUICtrlSetData($idLabel_Filter_Transparenz, "Filter Transparenz " & $idSlider_Filter_Transparenz & "/" & 255 & " HEX 0x" & Hex(GUICtrlRead($idSlider_Filter_Transparenz), 2)) EndIf $sSlider_Filter_Transparenz_old = GUICtrlRead($idSlider_Filter_Transparenz) If $idSlider_Frame_width_old <> GUICtrlRead($idSlider_Frame_width) Then GUICtrlSetData($idLabel_Frame_width, "Frame breite in Pixel " & $idSlider_Frame_width & "/" & 32 & " HEX 0x" & Hex(GUICtrlRead($idSlider_Frame_width), 2)) EndIf $idSlider_Frame_width_old = GUICtrlRead($idSlider_Frame_width) WEnd Func _get_HEX_Transparenz($id) $iHEX_Transparenz = GUICtrlRead($id) $iHEX_Transparenz = "0x" & Hex($iHEX_Transparenz, 2) Return ($iHEX_Transparenz) EndFunc ;==>_get_HEX_Transparenz Func _Exit() Exit EndFunc ;==>_Exit Func _IsChecked($idControlID) Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) EndFunc ;==>_IsChecked Local $idMsg Func Bild_Zusammenbauen() _PIC_scale(GUICtrlRead($idFile_Album)) $idFile_Album_rescale = @ScriptDir & "\Album rescale\" _GDIPlus_Startup() ; Load PNG image Local $hImage = _GDIPlus_ImageLoadFromFile(GUICtrlRead($idFile)) Local $iImageHeight = _GDIPlus_ImageGetHeight($hImage) Local $iImageWidth = _GDIPlus_ImageGetWidth($hImage) ;Vorlage im GUI anzeigen! Bilder wieder freigeben! iX und iY gibt an wo das Bild im Interface dargestellt werden soll. Local $iX = 0 ; Draw PNG image Local $iY = 0 Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) Local $bitmap_from_file _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, $iY) Local $iImageWidth_Pixel_Pic = GUICtrlRead($idwidth) ;_GDIPlus_ImageGetWidth($hImage) Local $iImageHeight_Pixel_Pic = GUICtrlRead($idwidth) ;_GDIPlus_ImageGetHeight($hImage) Local $iCounter = 1 Local $hStarttime = _Timer_Init() Local $iPercent, $iTime, $iRestzeit Local $iSaveOld ; Aufloesung der Ausgabe bestimmen = Vorlage Hoehe * Hoehe Pixel Pic = Hoehe Ausgabe in Pixel, analog dazu die Breite Local Const $width = $iImageWidth * $iImageWidth_Pixel_Pic Local Const $height = $iImageHeight * $iImageHeight_Pixel_Pic Local $hwnd = GUICreate("Clone Y", $width, $height) Local $graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd) Local $bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics) Local $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap) $iFrame_Transparenz = _get_HEX_Transparenz($idSlider_Frame_Transparenz) $iFilter_Transparenz = _get_HEX_Transparenz($idSlider_Filter_Transparenz) $iFilter_Frame_width = GUICtrlRead($idSlider_Frame_width) $iFilelist = _FileListToArray($idFile_Album_rescale) Local $iW = _GDIPlus_ImageGetWidth($hImage), $iH = _GDIPlus_ImageGetHeight($hImage) ;get width and height of the image Local $tBitmapData = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iW, $iH, BitOR($GDIP_ILMWRITE, $GDIP_ILMREAD), $GDIP_PXF32RGB) ;locks a portion of a bitmap for reading and writing. More infor at http://msdn.microsoft.com/en-us/library/windows/desktop/ms536298(v=vs.85).aspx Local $iScan0 = DllStructGetData($tBitmapData, "Scan0") ;get scan0 (pixel data) from locked bitmap Local $tPixel = DllStructCreate("int[" & $iW * $iH & "];", $iScan0) Local $iPixel, $iRowOffset,$iSave_old Local $aRandom[2] = [0, 4] ; 0 = keine Rotation 4= spiegeln! 90° 270° 180° gedreht sieht nicht gut aus. For $i = 0 To $iImageHeight - 1 Step 1 ; Y Achse pro Pixel ein Bild generieren! $iRowOffset = $i * $iW + 1 For $j = 0 To $iImageWidth - 1 Step 1 ; X Achse pro Pixel ein Bild generieren! $iColor = DllStructGetData($tPixel, 1, $iRowOffset + $j) ;get pixel color Local $iSave = $idFile_Album_rescale & $iFilelist[Random(1, $iFilelist[0], 1)] if NOT _IsChecked($idCheckbox_SamePicture) Then While StringInStr($iSave, "Thumbs.db") or ($iSave == $iSave_old) Local $iSave = $idFile_Album_rescale & $iFilelist[Random(1, $iFilelist[0], 1)] ; Random(1,$iFilelist[0],1) ;Zufälligses Bild auswählen! WEnd Else While StringInStr($iSave, "Thumbs.db") Local $iSave = $idFile_Album_rescale & $iFilelist[Random(1, $iFilelist[0], 1)] ; Random(1,$iFilelist[0],1) ;Zufälligses Bild auswählen! WEnd EndIf $iSave_old = $iSave $bitmap_from_file = _GDIPlus_BitmapCreateFromFile($iSave) ; Grafik zwischenspeichern, die Bilddatei auf die enstprechende Position legen. $iColorHEX = $iFrame_Transparenz & String(Hex($iColor, 6)) ;Farbe der transparenzen umrandung ermitteln Local $hPen = _GDIPlus_PenCreate(($iColorHEX), $iFilter_Frame_width) ;color format AARRGGBB (hex) $iSave2 = _GDIPlus_ImageGetGraphicsContext($bitmap_from_file) _GDIPlus_GraphicsDrawRect($iSave2, 0, 0, GUICtrlRead($idwidth), GUICtrlRead($idwidth), $hPen) $iColor_Brush = $iFilter_Transparenz & String(Hex($iColor, 6)) Local $hBrush = _GDIPlus_BrushCreateSolid($iColor_Brush) ;color format AARRGGBB (hex) _GDIPlus_GraphicsFillRect($iSave2, 0, 0, GUICtrlRead($idwidth), GUICtrlRead($idwidth), $hBrush) If _IsChecked($idRadio_Rotation) Then _GDIPlus_ImageRotateFlip($bitmap_from_file, Random(0, 4, 1)) ; Randomfunktion mit einem 1D Array mit vorgegebenen Zahlen 0 und 4 EndIf If _IsChecked($idRadio_Mirror) Then _GDIPlus_ImageRotateFlip($bitmap_from_file, $aRandom[Random(0, 1, 1)]) ; Randomfunktion mit einem 1D Array mit vorgegebenen Zahlen 0 und 4 EndIf _GDIPlus_GraphicsDrawImage($backbuffer, $bitmap_from_file, $j * $iImageWidth_Pixel_Pic, $i * $iImageHeight_Pixel_Pic) ; Kleine Grafik in die Bilddatei malen _GDIPlus_BrushDispose($hBrush) _GDIPlus_PenDispose($hPen) _GDIPlus_ImageDispose($bitmap_from_file) _GDIPlus_ImageDispose($iSave) Next $iPercent = Round($iCounter / ($iImageHeight * $iImageWidth) * 100, 0) ; % Anzeige Durchlauf/(Hoehe*Breite*100) $iTime = Round(_Timer_Diff($hStarttime) / 1000, 0) ;Zeit in Sekunden angeben $iRestzeit = Round($iTime / $iPercent * 100 - $iTime, 0) ; Restzeit $iCounter = $iCounter + $iImageWidth ; Durchlauf um 1 Hochzählen! Sicher auch mit $i*$j oder so machbar GUICtrlSetData($label_Progress, $iPercent & "%" & " " & $iTime & " Dauer Sekunden | geschätzte Restzeit = " & $iRestzeit) GUICtrlSetData($idProgressbar1, Round($iCounter / ($iImageHeight * $iImageWidth) * 100, 0)) Next _GDIPlus_BitmapUnlockBits($hImage, $tBitmapData) ;unlocks a portion of a bitmap that was locked by _GDIPlus_BitmapLockBits $iFilename = @ScriptDir & "\Ausgabe\" & $iImageHeight & $iImageWidth & $iTime & " " & @HOUR & @MIN & @SEC & ".jpg" _GDIPlus_ImageSaveToFile($bitmap, $iFilename) _GDIPlus_BitmapDispose($bitmap) ;Bilddateien für Windows wieder freigeben! _GDIPlus_GraphicsDispose($backbuffer) ;Bilddateien für Windows wieder freigeben! _GDIPlus_Shutdown() ShellExecute($iFilename) ;Bild oeffnen! MsgBox(0, "PIC to PIC Generator", "Fertig Dauer: " & $iTime & " Sekunden") EndFunc ;==>Bild_Zusammenbauen Func DrawInsert($hGraphic, $hImage2, $iX, $iY, $fAngle, $iWidth, $iHeight, $iARGB = 0xFF000000, $iPenWidth = 1) Local $hMatrix, $hPen2 $hMatrix = _GDIPlus_MatrixCreate() _GDIPlus_MatrixRotate($hMatrix, $fAngle, "False") _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix) _GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, $iX, $iY) $hPen2 = _GDIPlus_PenCreate($iARGB, $iPenWidth) _GDIPlus_GraphicsDrawRect($hGraphic, $iX, $iY, $iWidth, $iHeight, $hPen2) _GDIPlus_MatrixDispose($hMatrix) _GDIPlus_PenDispose($hPen2) Return 1 EndFunc ;==>DrawInsert Func SelectFileVorlage() Local $hGraphic Local Const $sMessage = "Select a single file of any type." Local $sFileOpenDialog = FileOpenDialog($sMessage, @ScriptDir & "\" & "Vorlage\", "Bild (*.png)", $FD_FILEMUSTEXIST) If @error Then ; Display the error message. MsgBox($MB_SYSTEMMODAL, "", "No file was selected.") FileChangeDir(@ScriptDir) Else FileChangeDir(@ScriptDir) $sFileOpenDialog = StringReplace($sFileOpenDialog, "|", @CRLF) GUICtrlSetData($idFile, $sFileOpenDialog) EndIf _GDIPlus_Startup() ; Load PNG image _WinAPI_RedrawWindow($hGUI) Local $hImage = _GDIPlus_ImageLoadFromFile(GUICtrlRead($idFile)) Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) Local $iImageHeight = _GDIPlus_ImageGetHeight($hImage) Local $iImageWidth = _GDIPlus_ImageGetWidth($hImage) GUICtrlSetData($idLabel_Outputresolution,"Aufloesung der Ausgabe = " & $iImageWidth * GUICtrlRead($idwidth) & "X" & $iImageHeight * GUICtrlRead($idwidth)) _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0) _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() EndFunc ;==>SelectFileVorlage Func SelectFileAlbum() Local Const $sMessage = "Select a folder" Local $sFileSelectFolder = FileSelectFolder($sMessage, @ScriptDir & "\" & "Album 28.01.2017\") If @error Then MsgBox($MB_SYSTEMMODAL, "", "No folder was selected.") Else EndIf EndFunc ;==>SelectFileAlbum Func _PIC_scale($iAlbum_Folder) Local $hBitmap1, $hImage1, $hGraphics Local $width_resize = GUICtrlRead($idwidth) Local $height_resize = GUICtrlRead($idwidth) _GDIPlus_Startup() DirCreate("Album rescale\") $iFilelist_PIC = _FileListToArray($iAlbum_Folder, "*.jpg") For $j = 1 To $iFilelist_PIC[0] $hBitmap1 = $iAlbum_Folder & $iFilelist_PIC[$j] ;MsgBox(0, "TEST", $hBitmap1) $hImage = _GDIPlus_BitmapCreateFromFile($hBitmap1) $hImage_rescale = _GDIPlus_ImageResize($hImage, $width_resize, $height_resize) $hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage_rescale) $sSave_mini_Image = @ScriptDir & "\Album rescale\" & $iFilelist_PIC[$j] _GDIPlus_ImageSaveToFile($hImage_rescale, $sSave_mini_Image) GUICtrlSetData($label_Progress,"Bild wird neu skaliert " & $sSave_mini_Image) _GDIPlus_ImageDispose($hImage1) _WinAPI_DeleteObject($hBitmap1) If @error Then ConsoleWrite("ERROR " & @error & @CRLF) EndIf Next _GDIPlus_Shutdown() ;Return ("Album rescale\") EndFunc ;==>_PIC_scale
Unaufgeräumten Code hochgeladen.