Beiträge von Andy
-
-
Zitat
Woher hast du denn deine HSV Funktion genommen? Von Autoit übersetzt?
Ja, ich hatte für das Assemblertut eine Funktion gesucht, die man "einfach" 1:1 in Assembler übersetzen kann. Eigentlich war ich ziemlich begeistert, da nur relativ einfache Rechnerei umzusetzen war. Allerdings wurde die Umsetzung doch relativ umfangreich, so dass ich mich entschlossen habe, das Beispiel nicht im Tut zu verwenden.
Übrigens hatte ich den ursprünglich mit Float-Zahlen werkelnden Algorithmus komplett in Integer umgesetzt! Zuerst in AutoIt, dann in Assembler. In AutoIt war natürlich kaum ein Geschwindigkeitszuwachs bemerkbar, in Assembler allerdings war der Schub gewaltig, unoptimiert (war ja fürs Tut geplant) schon Faktor 4! Ich denke, auch C++-Programmierer hätten von diesem Wink mit dem Zaunpfahl profitiert.Da auch die anschliessende Matrixmultiplikation extrem gut zu parallelisieren ist, habe ich "multithreating" - AutoIt benutzt. Prog@ndy hatte zu diesem Thema mal einiges gezeigt, aber mit AutoItcode kommt man nicht weiter, da AutoIt nicht threadsicher ist. Das ist der weitere Vorteil von Assembler, man weiss ziemlich genau, was der Prozessor (bzw ASM-code) macht oder auch nicht macht. Daher ist es kein Problem 3-4 Threads mit aufwendigen Berechnungen gleichzeitig zu starten und dann auf Ergebnisse zu warten. Leider bringt Multithreathing nicht sonderlich viel, solange die Threads nur auf einem Core laufen ^^. Allerdings ist es schon beeindruckend, wenn das AutoItscript 4 Threads anstösst und sofort mit dem Programmcode weitermacht. Für hochkomplexe und langwierige Berechnungen lohnt sich das sicher!
ZitatAber ich dachte immer das wär viiieeell komplizierter soetwas.
Learning by doing! Bleib am Ball, du lernst jeden Tag etwas dazu!
/edit/ Integerversion
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
;hier nun die Variante, die intern nur mit Integerzahlen arbeitet, in AutoIt bringt das kaum Geschwindigkeitsgewinn, in Assembler um so mehr!
Func int_ColorConvertRGBtoHSL($avArray) ;integerversion
;die Variablen werden als Integer übergeben;die Variablen werden NICHT durch die Konstante $__COLORCONSTANTS_RGBMAX =255 geteilt
[/autoit] [autoit][/autoit] [autoit]
local $nR = int(Number($avArray[0]))
local $nG = int(Number($avArray[1]))
local $nB = int(Number($avArray[2]))local $nMax = $nB
[/autoit] [autoit][/autoit] [autoit]
If $nMax < $nG Then $nMax = $nG
If $nMax < $nR Then $nMax = $nRlocal $nMin = $nR
[/autoit] [autoit][/autoit] [autoit]
If $nMin > $nG Then $nMin = $nG
If $nMin > $nB Then $nMin = $nBlocal $nMinMaxDiff = ($nMax - $nMin)
[/autoit] [autoit][/autoit] [autoit]
local $nMinMaxSum = ($nMax + $nMin); Lightness
[/autoit] [autoit][/autoit] [autoit]
;Bis hierhin alles wie gehabt
;Wenn man nun ausschliesslich den Rechenweg für die Ermittlung von $nL in der Orginalfunktion anschaut, stellt man fest, dass
;$nL = ($nMinMaxDiff / $__COLORCONSTANTS_RGBMAX) / 2 * $__COLORCONSTANTS_HSLMAX
;Konstanten einsetzen führt zu $nL = ($nMinMaxDiff / 255) /2 * 240
;Zwei DIV-Befehle sind im Assembler sehr "teuer" d.h. kosten sehr viel Zeit, schön wäre es, das DIV durch eine Multiplikation
;ersetzen zu können und eine Division durch ein extrem schnelles shiften von Bits zu ersetzen.
;Ein BitShift nach rechts ist Division durch 2, wir müssen also die Gleichung nur so erweitern, daß durch eine Potenz von 2 geteilt wird.
;$nL = ($nMinMaxDiff / 255) * 120 :erweitern mit 2^16 (hohe Potenz von 2) führt zu
; 2^16 * $nL = ($nMinMaxDiff / 255) * 120 * 2^16 :zusammenfassen auf der rechten Seite fuhrt zu 2^16/255*120=30840.47 welches zur nächsten Ganzzahl aufgerundet wird, also 30841 um den Rundungsfehler bei Integer auszugleichen
; 2^16 * $nL = $nMinMaxDiff * 30841
; $nL = $nMinMaxDiff * 30841 / 2^16
;Geteilt durch 2^16 entspricht einem BitShift nach rechts von 16, das führt der Prozessor in EINEM Takt durch, die Division würde ca 40-80 Takte dauern!local $nL=$nMinMaxSum*30841/65536 ;(shr 16) führt zum gleichen Ergebnis wie /2^16
[/autoit] [autoit][/autoit] [autoit]
;also kann man schreiben
;$nL=BitShift($nMinMaxSum*30841,16) ;diese zeile kann man fast genau so in Assembler übernehmen
$avArray[2] = $nL ;und abspeichern im Array; Grayscale
[/autoit] [autoit][/autoit] [autoit]
$nH = 0
$nS = 0
;Die Formeln etwas ausmultiplizieren führt zu
If $nMinMaxDiff <> 0 Then
; Saturation
If $nL < 120 Then
local $nS = int($nMinMaxDiff *240 / $nMinMaxSum)
Else
local $nS = int($nMinMaxDiff *240/ (510-$nMinMaxSum))
EndIf
$avArray[1] = $nS; Hue
[/autoit] [autoit][/autoit] [autoit]
Switch $nMax
Case $nR
local $nH = int(($nG - $nB)*40 / $nMinMaxDiff)
If $nH < 0 Then $nH += 239 ;Rundungsfehler ausgleichencase $nG
[/autoit] [autoit][/autoit] [autoit]
local $nH = int(($nB - $nR)*40/ $nMinMaxDiff) ;+80
If $nH < 0 Then
$nH += 79 ;Rundungsfehler ausgleichen
else
$nH += 80
endif
case $nB
local $nH = int(($nR - $nG)*40 / $nMinMaxDiff) ;+160
If $nH < 0 Then
$nH += 159 ;Rundungsfehler ausgleichen
else
$nH += 160
endif
EndSwitchIf $nH > 240 Then $nH -= 240
[/autoit] [autoit][/autoit] [autoit]
EndIf
$avArray[0] = int($nH)Return $avArray
[/autoit]
;die Funktion ist nun vollständig im Integerzahlenraum, man muss keine Fliesskommazahlen verarbeiten!
;Darurch können die sehr einfachen Assemblerbefehle benutzt werden!
EndFunc ;==>_ColorConvertRGBtoHSL -
-
Bei mir sieht das so aus:
Nach einem RGB2HSV bekomme ich vom linken Teil des Orginalbildes aus deinem Link das hier:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
Und nach 2x Sobel-Matrix (senkrecht und waagrecht) :
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
Wozu brauchst du die Kantenerkennung? -
-
Das war ein Schuss aus der Hüfte in 2 min zusammengehackt. Bei Dateien >2 Gig muss man 64Bit-Pointer verwenden, siehe http://msdn.microsoft.com/en-us/library/…2(v=VS.85).aspx
auch die Infos in http://msdn.microsoft.com/en-us/library/…1(v=VS.85).aspx sollte man beachten.
Man kann so natürlich auch die Dateien (Sektoren) bearbeiten, d.h. schreiben, obwohl im READ-Mode(0) geöffnet wurde.
Für "Geheimniskrämer" besteht so die Möglichkeit, am "Dateisystem" vorbei Daten auf den Datenträger zu schreiben, die nirgendwo im Dateisystem auftauchen.
Man schreibt dazu in einen Sektor (idR 512 Bytes gross) der nur zu einem kleinen Teil von einem Dateifragment belegt ist (z.B. von einer 5 Byte grossen DUMMY.TXT-Datei), seine Daten hinter den "eigentlichen" Dateiinhalt. Da Windows nur Daten in "freie" Sektoren schreibt, bleibt der "geheime" Inhalt so lange in diesem Sektor, bis dieser durch einen Dateisystembefehl (Move, Delete der DUMMY.TXT usw) überschrieben wird. -
[autoit]
#include <Constants.au3>
[/autoit][autoit][/autoit][autoit]Local Const $sFile = @AutoItExe
[/autoit][autoit][/autoit][autoit]
Local $hFile = FileOpen($sFile, 0); Prüft Dateiposition und versucht den Inhalt ab der aktuellen Dateiposition zu lesen.
[/autoit][autoit][/autoit][autoit]
MsgBox(0, "FileGetPos", StringFormat("Position: %d\nDaten:\n%s", FileGetPos($hFile), FileRead($hFile))); Setzt nun die Position an 21354...
[/autoit][autoit][/autoit][autoit]
Local $n = FileSetPos($hFile,21354,$FILE_BEGIN)for $i=0 to 5 ;...und liest 5x 1024 Byte ein
[/autoit][autoit][/autoit][autoit]
; Prüft Dateiposition und versucht 1 Kb ab der aktuellen Dateiposition zu lesen.
MsgBox(0, "FileGetPos", StringFormat("Position: %d\nDaten:\n%s", FileGetPos($hFile), stringtobinary(FileRead($hFile,1024))))
Local $n = FileSetPos($hFile,1024 ,$FILE_CURRENT) ;Dateiposition 1024 Byte weiter setzen
Next; Schließt das Handle.
[/autoit][autoit][/autoit][autoit][/autoit]
FileClose($hFile) -
[autoit]
#include <WinAPI.au3>
[/autoit][autoit][/autoit][autoit]
#include <GDIPlus.au3>
_GDIPlus_Startup() ;wichtig!$dc = _WinAPI_GetDC(0) ;der DC des Desktops, der "compatibleDC" erstellt einen kompatiblen DC, in den du auch reingezeichnet hast!
[/autoit][autoit][/autoit][autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dc = ' & $dc & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$sprite = _GDIPlus_ImageLoadFromFile( "rgbhsv.jpg")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sprite = ' & $sprite & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console$graphics = _GDIPlus_GraphicsCreateFromHDC($dc)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $graphics = ' & $graphics & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
_GDIPlus_GraphicsDrawImageRect($graphics, $sprite, 0, 0, 200, 200)While 1
[/autoit][autoit][/autoit][autoit]WEnd
[/autoit] -
schau dir mal das Beispiel zu
[autoit]_WinAPI_DrawLine ()
[/autoit]an...
/edit/ zeichnen....ich sollte die Fragen besser lesen... -
Zitat
Du solltest mal den Code hier posten.
ich weiss, wieso du nicht "deinen Code" geschrieben hast^^
-
Wahrscheinlich ist der Akku fast leer und der Hamster muss im Laufrad richtig Gas geben
Daher die Geräusche, der arme Kerl pfeifft auf der letzten Rille! -
Das mit dem "Eisenbahnrattern" habe ich auf einem älteren Rechner hier bei uns auch ab und zu. Hört sich eher an, als ob man einen Reissverschluss aufmacht. Das Geräusch kommt eindeutig aus dem Rechner, wenn das Mausrad bewegt wird. Sobald man aber das Fenster wechselt, ist das Phänomen weg! Da es nur ca. 1x pro Monat auftritt, habe ich damit auch kein Problem...
-
Kann es sein, dass die Geräusche aus dem Lautsprecher kommen?
-
Wieso 3D-Benchmark?
[autoit]
Der spricht doch grösstenteils die Graka an, und genau DAS wollen wir doch nicht testen?!
Die Prozessorauslastung kannst du auch mit 2 Zeilen AutoItcode auf 100% bringen.while 1
[/autoit]
wend
Als Exe kompilieren und einfach mehrmals starten, um die Prozessoren bzw Core´s alle zu belasten.... -
Da auch ohne ein AutoIt-Script zu starten massig GDI+-Funktionen vom System verwendet werden und natürlich auch Objekte bestehen, könnte ich mir gut vorstellen, dass bei Verwendung des AutoIt-Scriptes reichlich Prozessorlast erzeugt wird. Das "fiepen" könnte von Spannungswandlern oder sogar dem Lüfter kommen, wenn der Prozessor am Anschlag fährt^^
Gerade bei Notebooks bzw der (nicht) darin integrierten Grafikprozessoren werden ggf bestimmte GDI-Funktionen nicht von der Graka, sondern vom Prozessor übernommen. Was sagt der Taskmanager bezgl. der Prozessorauslastung?
Zeig doch mal ein Beispielscript. -
Zitat
oder schrittweises Auslesen einer Datei... Dann wird eben immer ein anderer Bereich ausgelesen und versendet...
Aber WIE...?Mit
[autoit]FileSetPos()
[/autoit]setzt man einen Zeiger in einer Datei, ab dem man dann einen bestimmten Datenbereich auslesen kann. Damit ist es auch möglich, Sektorenweise einen Datenträger auszulesen.
-
Video Controller wärs gewesen^^
Spoiler anzeigen
[autoit]; Generated by AutoIt Scriptomatic
[/autoit] [autoit][/autoit] [autoit]$wbemFlagReturnImmediately = 0x10
[/autoit] [autoit][/autoit] [autoit]
$wbemFlagForwardOnly = 0x20
$colItems = ""
$strComputer = "localhost"$Output=""
[/autoit] [autoit][/autoit] [autoit]
$Output = $Output & "Computer: " & $strComputer & @CRLF
$Output = $Output & "==========================================" & @CRLF
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM CIM_VideoControllerResolution", "WQL", _
$wbemFlagReturnImmediately + $wbemFlagForwardOnly)If IsObj($colItems) then
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
For $objItem In $colItems
$Output = $Output & "Caption: " & $objItem.Caption & @CRLF
$Output = $Output & "Description: " & $objItem.Description & @CRLF
$Output = $Output & "HorizontalResolution: " & $objItem.HorizontalResolution & @CRLF
$Output = $Output & "MaxRefreshRate: " & $objItem.MaxRefreshRate & @CRLF
$Output = $Output & "MinRefreshRate: " & $objItem.MinRefreshRate & @CRLF
$Output = $Output & "NumberOfColors: " & $objItem.NumberOfColors & @CRLF
$Output = $Output & "RefreshRate: " & $objItem.RefreshRate & @CRLF
$Output = $Output & "ScanMode: " & $objItem.ScanMode & @CRLF
$Output = $Output & "SettingID: " & $objItem.SettingID & @CRLF
$Output = $Output & "VerticalResolution: " & $objItem.VerticalResolution & @CRLF
if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
$Output=""
Next
Else
Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "CIM_VideoControllerResolution" )
Endif -
BugFix ,
[autoit]
Faweyr´s Einzeiler ist (auf meinem Rechner zumindest) ungeschlagen. Der Overhead des DllCalls frisst evtl. Performancegewinne sofort auf.
3xAND und 4x Addition ist auch in AutoIt "sauschnell"^^
Sehr interessant auch, dass die Sequenzif erstervergleich then
[/autoit]
if zweiterverglech then
if drittervergleich then
if viertervergleich thenLANGSAMER ist als der Einzeiler, der IMMER ALLE Vergleiche durchführen muss...
-
Zitat
Mich würde es aber interessieren, ob ich den wirklich meine Downloadgeschwindigkeit von 180 auf 400 kb/s erhöhen kann, ohne Nebenwirkungen?
Was soll die Frage?
In der Zeit, in der du hier einen Thread erstellst und die Antworten liest, hättest du 90% aller Optionen von TCPOptimizer ausprobieren können!
Ich weiss jedenfalls, dass TCPOptimizer bei einigen unserer Rechner (XP32) ziemlich viel gebracht hatte. Leider wurden bei jedem Windows-"Sicherheits"-Update die "Orginal"-Daten wiederhergestellt. Irgendwann blieb auch das aus, ob das an einigen meiner Mails an MS gelegen hatte weiss ich nicht
Seitdem "fluppt" es jedenfalls....
Bei neueren Rechnern (auch XP32) hat der Umstieg von einem 10Mb-Switch auf ein entsprechendes Gigabit-Gerät und entsprechenden Karten in den Rechnern am meisten gebracht
Sobald es allerdings, wie BugFix schon bemerkte, durch einen Router geht, sollte man dessen Einstellungen überprüfen!
-
Ja, Programme, welche die Mini-Preview unterstützen gibt es wohl einige, aber zumindest bei Tante Google habe ich keinen Hinweis auf ein "kostenloses" Programm gefunden, welches ALLE CDR-Versionen darstellen kann. Alternativ wird empfohlen, sich einige Lizenzen einer "alten" CD-Version zu besorgen (gibt es wohl für kleines Geld) und denjenigen, der die Dateien schickt zu bitten, in diesem Format (bzw Version) abzuspeichern!
/EDIT/ Was sagt eigentlich der Support von Corel zu diesem Problem? Normalerweise kontaktiert man als Kunde doch erst einmal den Hersteller....
-
aber sonst klappt noch alles?
das Passwort wird gehashed und mit dem hash im quellcode verglichen....wo ist da der Unterschied das Passwort direkt zu vergleichen?
Und jetzt komm nicht mit "PASSWORT" ist im Quellcode leichter zu finden als 0xAB22E2C248E6F22A....
-
ja, dann hast du dein Passwort verschlüsselt! Und was bringt dir das?
Woher weiss dein Programm denn, ob das entschlüsselte Passwort das richtige ist?
Das geht nur mit einem Vergleich....und schon bist du wieder in den A**** gekniffen, denn um zu vergleichen ob das entschlüsselte Passwort das richtige ist, brauchst du das......entschlüsselte Passwort!Mit ein bisschen googeln hättest du das aber auch herausgefunden! Man braucht nicht mal einen Decompiler, um den AutoItquellcode auszulesen, mit den einfachsten Windows Bordmitteln geht das auch. Aber auch andere Programmiersprachen sind nicht besser bzw. sicherer. Passwörter gehören nicht in den Quellcode! Bei einem "Passwortgeschützten WoW-"Angelbot" ist das einfach nur dämlich, wenn aber Zugangsdaten für FTP/Fileserver in einem Quellcode liegen, dann interessieren sich auch "böse Buben" dafür....und dann gnade dir Gott wenn du einem Staatsanwalt erklären muss, warum dein Server in einem Botnet fleissig Kinderpornos durch das Netz schickt!