| Autor |
Nachricht |
Christoph1972
        
Beiträge: 307 Erhaltene Danke: 1 Dabei seit: 20.09.2008
VS2005 Standard / C# & VB.Net
|
Hallo Leute,
ich möchte Pixel von einem „schwarz“ –weiß Image verändern. Und zwar möchte ich die Farbe der schwarzen Pixel in eine beliebige Farbe ändern. Bisher habe ich das so gemacht und bin damit gut gefahren:
Nun ist es aber so, das in einigen Images die Grafik abgestuft ist, also dunkel grau - bis schwarze Pixel. Da komme ich mit der Methode natürlich nicht weiter.
Es wäre kein Problem, wenn alle Pixel die nicht weiß sind, in schwarz umgewandelt werden. Das wäre genau das was ich benötige.
Hat jemand eine Idee, wie alle Farben die in dem Image enthalten sind in eine ColorMap bekomme? Wobei ich nicht die GetPixel Methode mit einer Schleife verwenden möchte, das dauert viel zulange.
Mit einer ColorMatrix könnte es auch gehen, ich habe nur keine Vorstellung, wie die Matrix für schwarz abgebildet werden muss.Diese Matrix macht ein Image schwarz weiß, mit Grauabstufungen:
Ehrlich gesagt verstehe ich die ColorMatrix nicht wirklich und bin daher nicht in der Lage sie so zu ändern, dass sie nur schwarz abbildet.
Besteht eventuell eine Möglichkeit es "einfach" über die ImageAtributes zu lösen?
Vielleicht hat ja jemand eine Idee. Ich befürchte das es viel einfacher ist als ich denke, aber wer weis.......
_________________ Gruß
Christoph
|

|
|
Christian S.
        

Beiträge: 17441 Erhaltene Danke: 95 Dabei seit: 07.07.2002 Wohnort: Server-Souterrain
Win 7 Delphi Prism, C# (VS 2010)
|
Hast Du mal geschaut, wie schnell das ist, wenn Du es mittels LockBits und den entsprechenden Operationen direkt an den Bytes machst? Ich habe das ein paar Mal benutzt und der Geschwindigkeitsvorteil gegenüber GetPixel / SetPixel ist sehr, sehr deutlich.
_________________ I am of peace. Always.
|

|
|
Christoph1972
        
(Threadstarter)
Beiträge: 307 Erhaltene Danke: 1 Dabei seit: 20.09.2008
VS2005 Standard / C# & VB.Net
|
Ah, vielen Dank für die Info! Von LookBits und den entsprechenden Operationen habe ich bisher nichts gehört. Ich werde mich darüber informieren. Anregungen und Hinweise sind wie immer willkommen!
_________________ Gruß
Christoph
|

|
|
danielf
       
Beiträge: 900 Erhaltene Danke: 14 Dabei seit: 28.01.2009 Wohnort: Stuttgart
Windows XP C# (VS 2008)
|
Hallo,
schau mal hier habe ich ein Tutorial mit einem hilfreichen Vergleich gefunden. Selber habe ich damals für Bildoperationen auch die Bitlock-Methode verwendent, wie sie Christian angesprochen hat. Müsste aber erst nachschauen wie ich das damals 'genau' gemacht hab. Ansatzweise sah es so aus.
Wenn du damit nicht weiter kommst, kann ich gerne mal mein Projekt laden (gerade kein Zugriff) und schauen wie ich es da gemacht hab.
Gruß Daniel
|

|
|
Christoph1972
        
(Threadstarter)
Beiträge: 307 Erhaltene Danke: 1 Dabei seit: 20.09.2008
VS2005 Standard / C# & VB.Net
|
Hallo Leute,
ich musste leider feststellen, dass es doch keine gute Lösung ist, das Image komplett einzuschwärzen. Von daher hat sich die Fragestellung erledigt.
Was mich aber doch interessiert, ist die Optimierung der GetPixel Methode, mittels unsafe Aufruf. So wie ich es gemacht habe dauert es immer noch recht lange.
Ist das so korrekt?
_________________ Gruß
Christoph
|

|
|
Christian S.
        

Beiträge: 17441 Erhaltene Danke: 95 Dabei seit: 07.07.2002 Wohnort: Server-Souterrain
Win 7 Delphi Prism, C# (VS 2010)
|
Wird unsafe nicht nur dann schneller, wenn man auch unsafe Operationen ausführt?
Auch hier würde ich wieder zum LockBits-Schema raten.
_________________ I am of peace. Always.
|

|
|
danielf
       
Beiträge: 900 Erhaltene Danke: 14 Dabei seit: 28.01.2009 Wohnort: Stuttgart
Windows XP C# (VS 2008)
|
Nein, so einfach ist es nicht
Du hast die Methode zwar als unsafe deklariert, aber verwendest dennoch mit der GetPixel-Methode eine Methode die im managed Bereich läuft.
Zum Beispiel für 24bppRGB:
Besser ist es aber das LockBits nur einmal zu machen, am besten in einer Art Helper-Class der du das bitmap übergibts auf dem du arbeiten willst.
Gruß daniel
|

|
|
Christoph1972
        
(Threadstarter)
Beiträge: 307 Erhaltene Danke: 1 Dabei seit: 20.09.2008
VS2005 Standard / C# & VB.Net
|
Hi,
vielen Dank für die schnellen Antworten! Ich hatte das mit unsafe aus der Hilfe, weiter wird da nicht drauf eingegangen. Ok, das LookBits werde ich mir mal anschauen.
_________________ Gruß
Christoph
|

|
|
Christian S.
        

Beiträge: 17441 Erhaltene Danke: 95 Dabei seit: 07.07.2002 Wohnort: Server-Souterrain
Win 7 Delphi Prism, C# (VS 2010)
|
Hi!
Ich habe noch was bei mir auf der Platte gefunden. In grauer Vorzeit habe ich mal eine solche Klasse geschrieben, und nachdem ich gerade mal kurz drüber geguckt habe, scheint sie keine allzu schlimmen Jugendsünden zu enthalten. Außer einer: Das Disposable-Pattern war nicht richtig implementiert, was ich in Delphi Prism aber durch das hinzufügen eines Aspekts mit einer Zeile korrigieren konnte
Ich hänge mal Quelltext und Kompilat an. Das Assembly behauptet, .NET 3.5 zu brauchen (das hängt mit dem Aspekt zusammen), läuft bei mir aber auch in einer .NET 2.0 Anwendung problemlos, wenn man die Warnungen ignoriert.
Quelltext (pas, 13.07 KB)
Kompilat mit unvollständiger XML-Doku (zip, 4.64 KB)
Benutzen tust Du's dann z.B. so:
Beachte in der XML-Doku bitte aber auch die Hinweise zur AutoUpdate-Eigenschaft und dem entsprechenden Parameter in den Konstruktoren.
Grüße
Christian
Einloggen, um Attachments anzusehen!
_________________ I am of peace. Always.
|

|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
|
|
|