Autor |
Beitrag |
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 19.01.05 15:30
Guten Tag.
Ich hätte gerne ein Tutorial, einen Algorithmus oder einen Delphibefehl, mit dem man das Negativ eines Bildes, zB BMP, erstellen kann.
Bin im Forum und bei Google leider nicht fündig geworden.
Mfg
10f10
Moderiert von Udontknow: Status auf "Erledigt" gesetzt.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 19.01.05 15:39
Mit BitBlt ist dies möglich, wenn du den XOR-Modus auf eine weiße Grundfläche machst. IIRC.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
HolgerB
      
Beiträge: 91
Win XP
D6 Pers
|
Verfasst: Mi 19.01.05 16:05
Graphics32 hat dafür auch eine Prozedur an Bord und bietet noch viele weitere tolle und vor allem Schnelle funktionen.
graphics32.org/docum.../Routines/Invert.htm
|
|
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 19.01.05 16:53
Ich habe den Befehl gerade ausprobiert:
Delphi-Quelltext 1:
| BitBlt(PaintBox1.Canvas.Handle,0,0,80,108,Image1.Canvas.Handle,0,0,SRCINVERT); |
Allerdings funktioniert das Ganze nicht wie gewünscht. Bei mir konvertiert er weiß in so ein hässliches hellbraun. Selbst ein komplett weißes Image ist hinterher hellbraun.
Nun habe ich ein anderes Win-Theme und wenn ich auf Windows-Klassisch stelle wird das Bild auch schwarz, aber es kann ja nicht sein, dass ein Schwarz-Weiß Bild nicht in Weiß-Schwarz konvertiert wird, sondern in ein blaulila-hellbraun Bild..
Die Graphics32 Komponenten habe ich auch. Bisher bin ich aber noch nicht an dem Problem weiter gekommen, wie man TBitmap und TBitmap32 zueinander konvertiert.
One
|
|
GiO
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 25.01.05 18:35
|
|
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 25.01.05 18:49
Danke, funktioniert super
Gruß 10F10
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 25.01.05 20:12
Mir ist da gerade was an dem Quellcode aufgefallen. Du übergibst ein Bitmap als Parameter. Und lieferst dann noch ein Mal diese Instanz zurück. Das Zurückgeben und nochmalige zuweisen des Bitmaps kannst du dir sparen, da bei Klassen alles sofort auf die Klasseninstanz übertragen wird. Wenn du also lediglich die Rückgabe und Zuweisung des Bitmaps weg lässt, dann funktioniert dennoch alles wie bisher. Das macht auch den anderen Code schmaler.
Ich habe noch etwas. Ich weiß. Ich bin ein scheußlicher Perfektionist.
Zum Invertieren könnte man den Algorithmus noch optimieren. Also wenn man das unbedingt wollen würde.
Wenn man diese Zeile
Delphi-Quelltext 1:
| ByteArray[x] := 255 - ByteArray[x]; |
durch diese ersetzt
Delphi-Quelltext 1:
| ByteArray[x] := not ByteArray[x]; |
dann invertiert er das Byte. Das Ergebnis ist das Selbe obwohl keine Rechenoperation notwendig ist.
PS: Wenn man es ganz wahnsinnig mag, dann kann man das ganze auch als DWORD invertieren. Da der Prozessor 32Bit Register hat kann man so mehr Daten auf einen Schlag invertieren. Dann müsste man aber noch die letzten Bytes in der Zeile als Bytes invertieren. So eine Optimierung ist im Speicherkopieren von Delphi eingebaut.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
myukew
Hält's aus hier
Beiträge: 14
|
Verfasst: Di 01.02.05 16:49
nur weil man einen boolschen operator anwendet heißt das noch lange nicht dass man keine rechenoperation braucht. ich wär mir gar nicht so sicher dass das so viel schneller gehtschneller geht.
und die sache mit den dwords sollte ein ordentlicher compiler auch seber merken
imho
|
|
I.MacLeod
      
Beiträge: 109
|
Verfasst: Di 01.02.05 18:00
myukew hat folgendes geschrieben: | nur weil man einen boolschen operator anwendet heißt das noch lange nicht dass man keine rechenoperation braucht. |
Klar braucht er eine. Nur ist es ein "not" statt "sub".
myukew hat folgendes geschrieben: | und die sache mit den dwords sollte ein ordentlicher compiler auch seber merken |
Wohl eher nicht, da so tiefgreifende Optimierungen nicht so ohne weiteres zu implementieren sind (insbesondere mit annehmbarer Geschwindigkeit) und hier außerdem noch eine Anpassung am Quelltext notwendig wäre, um mit DWORDs zu arbeiten (es sei denn man wechselt vorher auf 32bit/Pixel [was natürlich vom Compiler erst recht nicht erkannt werden kann ;-)], aber dann würde ja auch noch das vierte Byte verändert, was wieder zu irgendwelchen Problemen führen könnte/würde)
//Edit:
Jetzt hab ich vor lauter Aufregung das vergessen was ich eigentlich posten wollte:
INVERTRECT
_________________ {$APPTYPE CONSOLE}uses SysUtils;const a='{$APPTYPE CONSOLE}uses SysUtils;const a=%s;begin write(Format(a,[#39+a+#39]))end.';begin write(Format(a,[#39+a+#39]))end.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 02.02.05 17:29
so viel schneller geht schneller geht
schönes echo 
|
|