ZitatOder er erfindet einen fetten kompressionsalgorytmus^^
Das muss aber ein verdammt guter Kompressionsalgorythmus sein ... Spiele und Filme werden dann in Zukunft nicht mehr auf DVD's verkauft sondern auf Disketten.
ZitatOder er erfindet einen fetten kompressionsalgorytmus^^
Das muss aber ein verdammt guter Kompressionsalgorythmus sein ... Spiele und Filme werden dann in Zukunft nicht mehr auf DVD's verkauft sondern auf Disketten.
ZitatSpiele und Filme werden dann in Zukunft nicht mehr auf DVD's verkauft sondern auf Disketten.
"Es ist sinnlos sich verrückt zu machen, indem ma
Back to the roots!!!
Oder er erfindet einen fetten kompressionsalgorytmus^^
Und genau das ist ja die leistung der Programmierer. Ich meinte das es nichts besonderes ist, statt einer Videodatei eine exe zu verwenden, ansonsten staune ich schon sehr darüber.
campweb das hört sich aber ein "bisschen" anders an ...
Und die .exe statt .film ist eben die Leistung, weil das quasi die kompression ist ...
Hab mal gelsen das die Grafik Datein von kkrieger "ungepackt" 100 irgendwas mb groß währen. Das verfahren nennt sich glaube ich Prozedurales Programmiern. Ich hab das (jetzt mal ganz vereinfacht) so verstanden:
[autoit][/autoit][autoit][/autoit][autoit]Prozedur(2) ; Gibt eine Bilddatei von einem Haus wieder
[/autoit][autoit][/autoit][autoit]Prozedur(242) ; Und hier bekommen wir dann die Mona Lisa
[/autoit][autoit][/autoit][autoit]Func Prozedur($Seed)
;Inser some Crazy Code here
endFunc
Zum ersten mal bin ich bei einem Youtube Video über ein Weltraum MMO gestoßen das seine Welt mit mehrern Milliarden Planet ebenso erzeugt.
Das verfahren nennt sich glaube ich Prozedurales Programmiern.
Prozedurale Programmierung bezeichnet einfach nur das Prinzip Teilprobleme in Funktionen (auch "Prozeduren" genannt) auszulagern und eigenständig benutzbar zu machen.
Also nichts weiter was wir in AutoIt nicht auch schon die ganze Zeit machen.
Programmiert werden diese Dinger in der Regel komplett in Assembler.
Somit können die schonmal den ganzen Overhead den ein Compiler erzeugt hinter sich lassen.
Und dann - ja dann - kommt eine riesen Menge Gehirnschmalz um Algorithmen zu finden die die schnell sind und platzsparend.
Immer wieder erstaunlich , was Leute , die die ganze Assemblerzeit mitbekommen haben , so auf`n Kasten haben
Ich versteh immer noch nicht, wie man so etwas in Echtzeit rund HD realisieren kann!
Hier ist die Auslastung bei FullHD (1080p) bei 2x2,8 GHz und 3,3 GB ram
Also wird nicht einmal 100% ereicht und beim RAM macht sich auch nicht viel!
So etwas geniales hatte ich frühstens 2025 erwartet!
[Blockierte Grafik: http://www7.pic-upload.de/05.02.11/5zi22cuj85h.png]
so etwas beweist eindeutig zu viel Freizeit!
Von was redest du hier?
Hier geht es nicht um Videokomprimierung sondern um Computergrafikgenerierung.
Was hat denn Super (ein Programm welches verschiedene Video-Encoder mitbringt) damit zu tun?
Bitte wieder back to topic.
Ne ich glaub der raft die leistung einfach nicht.
Und meint das sowas ganz mega einfach zu realisieren ist mit dem was es schon gibt.
Der Virustotal scan sagt alles
http://www.virustotal.com/file-scan/repo…6ed0-1296910162
@Matthias_199, danke dass dus aussprvht, stimme dir zu.
tutti, woran das liegtsgt Andy auf Seite 1 und postet ein Original
"SUPER 2009 kann ich da empfehlen. Das is mal richtig genial <img style="font-style: italic;" src="http://www.computerhilfen.de/hilfen/Smileys/default/cheesy.gif" alt="wysiwyg image" />
Beispiel: Mit Fraps GTA4 aufgenommen und mit VirtualDup die 4 Avi´s zusammen verbunden - Ergebniss war dann ne knapp 18GB grosse Avi...
Mit Super2009, in meinem Fall ergab das dann knapp 50Mb (je nach Qualitätswunsch)Dieses kann von sämtlichen, in sämtliche Auflösungen und/oder Formaten bewerktstelligt werden.
Sehr zuempfehlen... "Für das Video in Verbindung mit einem "Video zu Exe" Konverter und einer MiniGUI die die Auswahl der AUflösung enthält ergeben schon ein ganz gutes Ergebnis.
Nicht dein ernst oder?
@campweb, man merkt wieder deutlich, dass Leute mitreden, die auch nicht ansatzweise Ahnung haben um was es geht
IM 12. Post hier im Thread habe ich die Seite von Iñigo Quílez verlinkt, der in der Demo-Szene u.a. mit seinem Team rgba eingeschlagen ist. Bei Pixar war er bis vor kurzem noch technischer Direktor Animationen.
Um z. B. diesen Schmetterling
autoit.de/wcf/attachment/12507/
zu "erzeugen", könnte man haufenweise Pixel "malen", komprimieren und würde dadurch haufenweise Speicherplatz verschwenden und es wärre schnarchlangsam!
Überführt man aber diesen Schmetterling in eine mathematische Funktion,
autoit.de/wcf/attachment/12508/
dann kann man damit Shader programmieren und somit den Schmetterling in jeder beliebigen Auflösung und natürlich auch animiert darstellen.
Die Handvoll Formeln stellen wirklich den Schmetterling dar!
Ich hab mal in ein AutoItscript gepackt, wie man z.B Kleeblätter "konstruieren" kann...
;kleeblatt
$user32 = DllOpen("user32.dll")
$gdi32 = DllOpen("gdi32.dll")
$w = 400
$h = 400
Global $pi = 4*atan(1)
[/autoit] [autoit][/autoit] [autoit]$hgui = GUICreate("Kleeblatt")
$hdc_gui = getdc($hgui)
GUISetState()
for $x=1 to $w
for $y=1 to $h
$r=sqrt((($w/2)-$x)^2+(($h/2)-$y)^2)/150
$p=atan2(($w/2)-$x,($h/2)-$y)
$l=$r/(((1+cos(4*$p))^0.125)-(1/40*(1+cos(8*$p))^2))
$col=int(1/4*(1-$l)^0.125*(1+$l^16)*(1+3*$r)*256)*256
pix($hdc_gui,$x,$y,$col)
Next
Next
while GUIGetMsg()<>-3
wend
func atan2($y,$x)
return (2*atan($y/($x+sqrt($x*$x+$y*$y))))
endfunc
Func pix($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
Habs mir angeschaut und ich finde es beeindruckend wie das überhaupt möglich ist.
3Min Film + Ton = 64KB ? Das sind etwas weniger als 3kBit/s für FullHD und Ton.
Ich bezweifele stark dass man das mittels kommpression erreichen kann. Nichtmal in hunderten Jahren^^
(Außer es schafft jemand einen konverter von Film -> Asm und Ton -> Asm zu bauen)
Daran sollten sich mal die großen Firmen ein Beispiel nehmen. Weil mich regt es schon auf, wenn die "modernen" Spiele 10-15 GB fressen oder sogar noch mehr. Wenn man es mal überlegt müsste das auch in 3-4MB passen.
Man könnte ja zugunsten der CPU eine lange Ladezeit einbauen und alle Grafiken schonmal vorab generieren.
Mit einer enormen Ladezeit müsste das auch in AutoIt möglich sein. (Wenn man die Frames berechnet und 'stapelt'. Dann braucht man vllt ein paar Tage bis alles berechnet ist (und wahrscheinlich gibt es eine RAM Überladung^^), hat dann aber einen flüssigen Film
Eine nette Demonstration, Andy.
Danke für dieses Beispiel, tatsächlich eine sehr intelligente Form "große" Datenmengen in kleine umzuwandeln.
Wenn man jetzt noch eine Funktion schreiben würde, die unsere Bilder in Zukunft in eine Func _Bild() umwandeln würde, dann hätten wir kein Problem mehr mit der größe unserer Programme ^^.
Zudem könnte man sich auch das lästige "FileInstall" oder .zip mit den ganzen Dateien sparen.
Aber alles noch Zukunft
ZitatWenn man jetzt noch eine Funktion schreiben würde, die unsere Bilder in Zukunft in eine Func _Bild() umwandeln würde, dann hätten wir kein Problem mehr mit der größe unserer Programme
Dem Manne kann geholfen werden!
http://de.wikipedia.org/wiki/Diskrete_Kosinustransformation
http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation
spart nicht viel, aber doch einiges.
ZitatDaran sollten sich mal die großen Firmen ein Beispiel nehmen. Weil mich regt es schon auf, wenn die "modernen" Spiele 10-15 GB fressen oder sogar noch mehr. Wenn man es mal überlegt müsste das auch in 3-4MB passen.
Solange der Krempel gekauft wird, haben die Hersteller überhaupt keine Veranlassung, irgendetwas zu ändern. Da steht dann auf der Spiele-Packung "erfordert mindestens 8GB RAM" und die Kiddies kaufen....sowohl Spiel als auch RAM! Im Zweifelsfall wird zum Spiel für 50€ auch gleich der passende Rechner für 1500€ gekauft....
Hab mir mal werkkzeug3 geholt (nur zum Testen der möglichkeiten)
Es ist schon interessant wie das alles aufgebaut ist.
Man hat eine Hand voll Grundeffekte (z.B. ein einfarbiger Kreis/Viereck), Einige Filter (Unschärfe, Rotieren, Kopieren, usw.) und Methoden zum verbinden von mehreren Ebenen. (mit addieren, subtrahieren, multi usw.)
Damit kann man im prinzip jede beliebige Textur in ein paar Zeilen herstellen und auch komplexe Sachen sind kein großes Problem (wenn sich das jemand holt das Letzte Beispiel mal anschauen)
Das ganze 3D Zeugs habe ich noch nicht vollständig verstanden.
Wenn man in der realen Welt schon niemand ist, dann muss man wenigstens virtuell irgendwelche Rekorde halten.
Deshalb suchten ungliaublich viele kleine Kinder vor dem PC. (und Facebook ist auch schuld. Die sind eh noch für den Weltuntergang verantwortlich...)
Außerdem klingt es doch nach viel mehr wenn man eine Blue Ray Disk, oder VIER DVD´s für ein Spiel erhält als eine läppische 8cm - CD (das Geilste Speichermedium der Welt xD. Und darauf wäre genug Platz für gigantische spiele).
Hi Andy,
ich hab mal ein bisschen mit deinem Code rumgespielt
Sehr "interessant" wie sich da etwas anordnet
$user32 = DllOpen("user32.dll")
$gdi32 = DllOpen("gdi32.dll")
$w = 400
$h = 400
Global $pi = 4 * ATan(1)
[/autoit] [autoit][/autoit] [autoit]$hgui = GUICreate("-")
$hdc_gui = GetDC($hgui)
GUISetState()
For $x = 1 To $w
For $y = 1 To $h
$r = Sqrt((($y - $w / 2 + $x) - $x) ^ 2 + (($h / 2) - $y) ^ 2) / 786
$p = atan2(($w / 2) - $x, ($h / 2) - $y)
$l = $r / (((1 + Cos(Random(1, 8, 1) * $p)) ^ (500)) - (1 / 40 * (1 + Cos(8 * $p)) ^ 2))
$col = Int(1 / 4 * (1 - $l) ^ (500) * (1 + $l ^ 16) * (1 + 3 * $r) * 786) * 786
pix($hdc_gui, $x, $y, $col)
Next
Next
While GUIGetMsg() <> -3
WEnd
Func atan2($y, $x)
return (2 * ATan($y / ($x + Sqrt($x * $x + $y * $y))))
EndFunc ;==>atan2
Func pix($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
Edit: Wie findet man eigentlich solche Formeln? Bin grade auf der Suche danach, Interessiert mich nähmlich sehr
lg,
Blume
Ich habe leider keine ahnung wie man "gezielt" nach solchen Sachen suchen kann...
Aber ich habe ein kleines Skript gebastelt womit man seine Ideen ausprobieren kann...
#include <Misc.au3>
#include <WinAPIEX.au3>
#include <GDIPlus.au3>
Opt("MustDeclareVars", 1)
Opt("GUIOnEventMode", 1)
Global Const $Size = 401
Global Const $Breite = $Size
Global Const $Hoehe = $Size
Global Const $Titel = 'Mustergenerator...'
Global Const $WS_EX_LAYERED = 0x00080000
Global Const $WS_POPUP = 0x80000000
Global Const $SRCCOPY = 0x00CC0020
Global Const $BLACKNESS = 0x00000042
Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
Global Const $Stretch = 1
Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
GUISetBkColor(0x000000, $hGUI)
WinSetTrans($hGUI, '', 255)
GUISetOnEvent(-3, '_Exit', $hGUI)
GUISetState(@SW_SHOW, $hGUI)
Global $hDC_GUI = _WinAPI_GetDC($hGUI)
Global $ptr_Backbuffer, $hbmp_Backbuffer
Global $hDC_Backbuffer = _CreateNewBmp32($Breite, $Hoehe, $ptr_Backbuffer, $hbmp_Backbuffer)
Global $DLL_Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr_Backbuffer)
Global $Frame, $Struct, $ptr, $hbmp
Global $Counter = 0
Global $Mode = 0 ;0 = Vorwärts, 1 = Rückwärts
Global $Neu = True
OnAutoItExitRegister('_Exit')
[/autoit] [autoit][/autoit] [autoit]_NeuesBild()
[/autoit] [autoit][/autoit] [autoit]While Sleep(20)
_Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
If _IsPressed('20') Then _NeuesBild()
If _IsPressed('53') Then _Save()
WEnd
;##########################HIER EIGENE FORMELN EINBAUEN############################################
; r = Rotanteil
; g = Grünanteil
; b = Blauanteil
; Es muss das Hex-Format verwendet werden. Hex(blabla, 2)
Func _Funktion($x, $y, ByRef $r1, ByRef $g1, ByRef $b1)
Local $r, $g, $b, $w = $Breite, $h = $Hoehe, $p, $l, $col
Local Static $Counter = 0
$Counter += 1
$r=sqrt((($w/2)-$x)^2+(($h/2)-$y)^2)/150
$p=atan2(($w/2)-$x,($h/2)-$y)
$l=$r/(((1+cos(4*$p))^0.125)-(1/40*(1+cos(8*$p))^2))
$col=int(1/4*(1-$l)^0.125*(1+$l^16)*(1+3*$r)*256)*256
Return $col
[/autoit] [autoit][/autoit] [autoit]$r1 = Hex($r, 2)
$g1 = Hex($g, 2)
$b1 = Hex($b, 2)
Return 0
EndFunc
;###################################################################################################
func atan2($y,$x)
return (2*atan($y/($x+sqrt($x*$x+$y*$y))))
endfunc
Func _NeuesBild()
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
_Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
Local $g = '88', $r = '34', $b = '99'
Local $Prozent = 0
Local $pxGes = $Hoehe * $Breite, $col
$Frame = _CreateNewBmp32($Breite, $Hoehe, $ptr, $hbmp)
$Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr)
For $i = 0 To $Hoehe Step 1
For $j = 0 To $Breite Step 1
$col = _Funktion($i, $j, $r, $g, $b)
If $col Then
DllStructSetData($Struct, 1, $col, $j * $Breite + $i + 1)
Else
DllStructSetData($Struct, 1, '0xFF' & $r & $g & $b, $j * $Breite + $i + 1)
EndIf
Next
$Prozent = ($i * $Hoehe + $j) / $pxGes
_GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
_GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
_Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
Next
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_Shutdown()
$Neu = True
Sleep(100)
EndFunc ;==>_BilderLaden
[/autoit] [autoit][/autoit] [autoit]Func _Save()
Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir & '\Muster', '(*,.png)', Default, Hex(Random(256, 16^3, 1), 3) & '.png')
_GDIPlus_Startup()
Local $bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
_GDIPlus_ImageSaveToFile($bm, $Pfad)
_GDIPlus_BitmapDispose($bm)
_GDIPlus_Shutdown()
EndFunc
Func _Exit()
ConsoleWrite('Blubb')
_WinAPI_ReleaseDC($hGUI, $hDC_GUI)
_Delete_Bitmap32($hDC_Backbuffer, $hbmp_Backbuffer)
_Delete_Bitmap32($Frame, $hbmp)
DllClose($h_NTDLL_DLL)
Exit
EndFunc ;==>_Exit
Func _Delete_Bitmap32($hDC, $hBmp)
_WinAPI_DeleteObject($hBmp)
_WinAPI_ReleaseDC(0, $hDC)
EndFunc ;==>_Delete_Bitmap32
Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hBmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iWidth)
DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hBmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
;_arraydisplay($adib)
_WinAPI_SelectObject($hcdc, $hBmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32
Func _C($a, $b)
Switch $b
Case 0 ;Y
Return @DesktopHeight / 2 - $a / 2
Case 1 ;X
Return @DesktopWidth / 2 - $a / 2
EndSwitch
EndFunc ;==>_C
Bei der "_Funktion" kann man seine Formel einsetzen und schauen wie das Ergebnis aussieht...
um der Prozeduralen Texturierung etwas näher zu kommen habe ich mal versucht die PerlinNoise Funktion nachzubauen.
War im Prinzip relativ einfach und die geht auch relativ Flott.
#include <Misc.au3>
#include <WinAPIEX.au3>
#include <GDIPlus.au3>
Opt("MustDeclareVars", 1)
Opt("GUIOnEventMode", 1)
Global Const $Size = 300
Global Const $Breite = $Size
Global Const $Hoehe = $Size
Global Const $Titel = 'Mustergenerator...'
Global Const $WS_EX_LAYERED = 0x00080000
Global Const $WS_POPUP = 0x80000000
Global Const $SRCCOPY = 0x00CC0020
Global Const $BLACKNESS = 0x00000042
Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
Global Const $h_MSIMG32_DLL = DllOpen('msimg32.dll')
Global Const $gdi32 = DllOpen('gdi32.dll')
Global Const $Stretch = 1
Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
GUISetBkColor(0x000000, $hGUI)
WinSetTrans($hGUI, '', 255)
GUISetOnEvent(-3, '_Exit', $hGUI)
GUISetState(@SW_SHOW, $hGUI)
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $hDC_GUI = _WinAPI_GetDC($hGUI)
Global $ptr_Backbuffer, $hbmp_Backbuffer
Global $hDC_Backbuffer = _CreateNewBmp32($Breite, $Hoehe, $ptr_Backbuffer, $hbmp_Backbuffer)
Global $DLL_Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr_Backbuffer)
Global $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC_GUI)
Global $Frame, $Struct, $ptr, $hbmp
Global $Counter = 0
Global $Mode = 0 ;0 = Vorwärts, 1 = Rückwärts
Global $Neu = True
OnAutoItExitRegister('_Exit')
[/autoit] [autoit][/autoit] [autoit];~ _NeuesBild()
Local $a = _PerlinNoise($Breite, $Hoehe, Random(1, 7, 1))
$Frame = $a[0]
$ptr = $a[2]
$hbmp = $a[1]
While Sleep(20)
_Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
If _IsPressed('20') Then _Neu()
If _IsPressed('53') Then _Save()
WEnd
Func _Neu()
_Delete_Bitmap32($Frame, $hbmp)
Local $a = _PerlinNoise($Breite, $Hoehe, Random(1, 7, 1))
$Frame = $a[0]
$ptr = $a[2]
$hbmp = $a[1]
EndFunc
[/autoit] [autoit][/autoit] [autoit];##########################HIER EIGENE FORMELN EINBAUEN############################################
; r = Rotanteil
; g = Grünanteil
; b = Blauanteil
; Es muss das Hex-Format verwendet werden. Hex(blabla, 2)
Func _Funktion($x, $y, ByRef $r1, ByRef $g1, ByRef $b1)
Local $r, $g, $b, $w = $Breite, $h = $Hoehe, $p, $l, $col
Local Static $Counter = 0
$Counter += 1
Local Static $start = 0.08
If $Neu Then
$Neu = False
$start += 0.01
ToolTip($start)
EndIf
$x = $x/$Breite * 256
$y = $y/$Hoehe * 256
;~ $r=sqrt((($w/2)-$x)^2+(($h/2)-$y)^2)/150
;~ $p=atan2(($w/2)-$x,($h/2)-$y)
;~ $l=$r/(((1+cos(4*$p))^0.125)-(1/40*(1+cos(8*$p))^2))
;~ $col=int(1/4*(1-$l)^0.125*(1+$l^16)*(1+3*$r)*256)*256
;~ Return $col
[/autoit] [autoit][/autoit] [autoit]$r=$x*Sin($y*$start)
$g=$x*Cos($y*$start)
$b=$x*Tan($y*$start)
$r1 = Hex($r, 2)
$g1 = Hex($g, 2)
$b1 = Hex($b, 2)
Return 0
EndFunc
;###################################################################################################
func atan2($y,$x)
return (2*atan($y/($x+sqrt($x*$x+$y*$y))))
endfunc
Func _PerlinNoise($b, $h, $Tiefe = 5)
If $Tiefe < 1 Then $Tiefe = 1
If $Tiefe > 7 Then $Tiefe = 7
;Es werden 6 Bilder erstellt und überlagert
_Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
Local $bmp = _GDIPlus_BitmapCreateFromGraphics($b, $h, $hGraphics)
Local $pxGes = 0, $col, $Prozent, $px = 0
For $p = 0 To $Tiefe Step 1 ;p = BildNummern
For $x = 0 To $b/2^($Tiefe-$p) Step 1
For $y = 0 To $h/2^($Tiefe-$p) Step 1
$pxGes += 1
Next
Next
Next
Local $bmp2 = _GDIPlus_BitmapCloneArea($bmp, 0, 0, $b, $h)
Local $bbuffer = _GDIPlus_ImageGetGraphicsContext($bmp2)
Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
For $p = 0 To $Tiefe Step 1 ;p = BildNummern
For $x = 0 To $b/2^($Tiefe-$p) Step 1
For $y = 0 To $h/2^($Tiefe-$p) Step 1
$px += 1
Switch Random(0, 1, 1)
Case 0
$col = '0x'&Hex(255/2^$p, 2)&'000000'
Case 1
$col = '0x'&Hex(255/2^$p, 2)&'FFFFFF'
EndSwitch
_pix($bmp, $x, $y, $col)
Next
$Prozent = $px / $pxGes
_GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
_GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
_Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
Next
_GDIPlus_GraphicsDrawImageRectRect($bbuffer, $bmp, 0, 0, $b/2^($Tiefe-$p), $h/2^($Tiefe-$p), 0, 0, $b, $h)
Next
Global $_ptr, $_hbmp
Global $_hdc = _CreateNewBmp32($b, $h, $_ptr, $_hbmp)
Local $gra = _GDIPlus_GraphicsCreateFromHDC($_hdc)
_GDIPlus_GraphicsDrawImage($gra, $bmp2, 0, 0)
_GDIPlus_GraphicsDispose($gra)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_GraphicsDispose($bbuffer)
_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_BitmapDispose($bmp)
_GDIPlus_BitmapDispose($bmp2)
Local $a[3] = [$_hdc, $_hbmp, $_ptr]
Return $a
EndFunc
Func _pix($hBitmap, $ix, $iy, $color)
DllCall($ghGDIPDll, "int", "GdipBitmapSetPixel", "hwnd", $hBitmap, "int", $iX, "int", $iY, "dword", $color)
EndFunc ;==>pix
Func _NeuesBild()
[/autoit] [autoit][/autoit] [autoit];~ _GDIPlus_Startup()
_Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
Local $g = '88', $r = '34', $b = '99'
Local $Prozent = 0
Local $pxGes = $Hoehe * $Breite, $col
$Frame = _CreateNewBmp32($Breite, $Hoehe, $ptr, $hbmp)
$Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr)
For $i = 0 To $Hoehe Step 1
For $j = 0 To $Breite Step 1
$col = _Funktion($i, $j, $r, $g, $b)
If $col Then
DllStructSetData($Struct, 1, $col, $j * $Breite + $i + 1)
Else
DllStructSetData($Struct, 1, '0xFF' & $r & $g & $b, $j * $Breite + $i + 1)
EndIf
Next
$Prozent = ($i * $Hoehe + $j) / $pxGes
_GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
_GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
_Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
Next
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hBrush)
;~ _GDIPlus_Shutdown()
$Neu = True
Sleep(100)
EndFunc ;==>_BilderLaden
[/autoit] [autoit][/autoit] [autoit]Func _Save()
Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir & '\Muster', '(*,.png)', Default, Hex(Random(256, 16^3, 1), 3) & '.png')
_GDIPlus_Startup()
Local $bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
_GDIPlus_ImageSaveToFile($bm, $Pfad)
_GDIPlus_BitmapDispose($bm)
_GDIPlus_Shutdown()
EndFunc
Func _Exit()
ConsoleWrite('Blubb')
_WinAPI_ReleaseDC($hGUI, $hDC_GUI)
_GDIPlus_Shutdown()
_Delete_Bitmap32($hDC_Backbuffer, $hbmp_Backbuffer)
_Delete_Bitmap32($Frame, $hbmp)
DllClose($h_NTDLL_DLL)
DllClose($h_MSIMG32_DLL)
DllClose($gdi32)
Exit
EndFunc ;==>_Exit
Func _Delete_Bitmap32($hDC, $hBmp)
_WinAPI_DeleteObject($hBmp)
_WinAPI_ReleaseDC(0, $hDC)
EndFunc ;==>_Delete_Bitmap32
Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hBmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iWidth)
DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hBmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
;_arraydisplay($adib)
_WinAPI_SelectObject($hcdc, $hBmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32
Func _C($a, $b)
Switch $b
Case 0 ;Y
Return @DesktopHeight / 2 - $a / 2
Case 1 ;X
Return @DesktopWidth / 2 - $a / 2
EndSwitch
EndFunc ;==>_C