Hallo zusammen,
ich schreibe an einem Programm zur Fraktalberechnung. (ich weiß davon gibts schon tausende ... ist auch eher zur Schulung und zum experimentieren). Die Berechnung klapp inzwischen ganz gut. Zum Setzen der einzelnen Pixel nutze ich die SetPixel-Funktion der user32.dll, das sie schneller ist als die GDI+ -Funktion (GraphicsFillRect). Ist die Berechnung des Fraktals abgeschlossen soll die erzeugte Grafik gespeichert werden. Dazu nutze ich wiederum GDI+, da ich in der user32.dll nix passendes gefunden habe. Ich wandle also meine Grafik in ein Bitmap um. Da die Größe der Grafik veränderlich ist, ist die letzte Funtion "BitmapCloneArea". Damit soll die Grafik ohne Rand ausgeschnitten werden um sie dann zu speichern. Und hier liegt mein Problem: entweder wird garnichts gespeichert oder nur der schwarze Hintergrund.
Ich habe das Script auf die wesentlichen Befehlszeilen gekürzt. Der Rest läuft ja.
Spoiler anzeigen
; Fraktalberechnung
; Scriptauszug - nicht lauffähig
#include-once
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
#include <ButtonConstants.au3>
#include <GdiPlus.au3>
#Include <Array.au3>
#include <EditConstants.au3>
#include <_GUIBox.au3>
#include <Misc.au3>
;---------------------------------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]$hWBild = GUICreate("Fraktal",$vDisplayBreite,$vDisplayHoehe, -1, 0) ; erstellt das Grafikfesnter
$dc = GetDC(WinGetHandle($hWBild)) ; ermittelt den Gerätekontext der Grafikfensters
$hWDaten=GUICreate("Datenfenster",$vDisplayBreite,150,-1,@DesktopHeight-170,-1,-1,$hWBild) ;erstellt das datenfenster
While 1 ; Warteschleife für die verschiedenen Funktionen vor und nach der Berechnung - eher uninteressant
;~ $nMsg=GUIGetMsg()
$aMsg = GUIGetMsg(1)
If $aMsg[1]=$hWBild Then
Switch $aMsg[0]
Case $GUI_EVENT_PRIMARYDOWN ; Rechteck zeichnen
$aMPos=MouseGetPos()
while _IsPressed("01",$user32)
ToolTip("Position: "&$aMPos[0]&"x"&$aMPos[1])
_GDIPlus_GraphicsDrawRect($hGraphic, $aMPos[0], $aMPos[1],MouseGetPos(0)-$aMPos[0],MouseGetPos(1)-$aMPos[1],$hPinsel)
WEnd
EndSwitch
ElseIf $aMsg[1]=$hWDaten Then
Switch $aMsg[0]
Case $bStart ;46
Start()
Case $bAbbrechen
Abbrechen()
Case $bRatio1
Verhaeltniss(1)
Case $bRatio2
Verhaeltniss(2)
Case $bRatio3
Verhaeltniss(3)
EndSwitch
EndIf
WEnd
Func Start()
; Berechnung des Fraktals bzw. Pixels und setzen des Pixels
setPixel($dc,$vSpalte,$vZeile,Farbwert($vDurchlauf,$vmD)) ; user32.DLL Funktion
; Am Ende der Berechnung
Fraktal_speichern()
EndFunc
[/autoit] [autoit][/autoit] [autoit]Func Fraktal_speichern()
_GDIPlus_Startup() ;Gdi starten
$hGraphic = _GDIPlus_GraphicsCreateFromHDC ($dc)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($vBreiteGrafik,$vHoeheGrafik,$hGraphic) ;Buffer ertsellen 1. Teil
;~ $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Buffer erstellen 2. Teil
$hKopie = _GDIPlus_BitmapCloneArea($hBitmap,0,0,$vBreiteGrafik,$vHoeheGrafik)
DirCreate(@ScriptDir&"\Bilder")
$vDateiName=@ScriptDir&"\Bilder\Test_1.jpg"
If _GDIPlus_ImageSaveToFile($hKopie,$vDateiName)Then
MsgBox(0,"Speichern ....","Bild wurde erfolgreich gespeichert !!! ",3)
Else
MsgBox(0,"Error",@error)
EndIf
EndFunc
Func setpixel($dc, $x, $y, $color) ;pixel mit farbe an koordinaten setzen
DllCall($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
EndFunc ;==>pix
Func GetDC($handle)
$dc = DllCall($user32, "int", "GetDC", "hwnd", $handle)
Return $dc[0]
EndFunc ;==>GetDC
Wo hab ich meinen Fehler versteckt ?
Vorab besten Dank...