vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Bild invertieren 
Autor: Preisser
Datum: 28.12.11 16:01

Hallo,

die Geschwindigkeitseinbußen kommen anscheinend daher, dass das Zugreifen auf die Width- und Height-Property eines Bitmaps sehr lange dauert. Wenn man das am Anfang in eine Variable kopiert und dann nur die Variablen als Schleifengrenze verwendet, geht es ungefähr 5x so schnell (allerdings ist es trotzdem noch langsamer, als vorher die Daten in ein normales Byte-Array zu kopieren, wie von dir gezeigt).

Übrigens geht es noch ein kleines bisschen schneller, wenn man direkt über den Pointer zugreift (z.B. als C#-Code in einem unsafe-Kontext):
        private static unsafe void InvertBitmap(Bitmap bmp) {
            BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width,
              bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
 
            int byteCount = bmp.Height * data.Stride;
            byte* pt = (byte*)data.Scan0.ToPointer();
 
            for (int i = 0; i < byteCount; i++, pt++) {
                *pt = (byte) (255 - *pt);
            }
 
            bmp.UnlockBits(data);    
        }
(Dort werden allerdings auch die Pixel verändert, die eigentlich nur zum Auffüllen der 4-Byte-Rundungslücken verwendet werden).

Ich habe spaßeshalber mal ein Bild mit 1280x1024 (24Bpp) verwendet und die Zeit von den 4 Varianten gemessen:
1) Verwendung von Marshal.CopyByte(...), um jeweils die einzelnen Bytes zu lesen und zu schreiben:
96 ms
2) Verwendung von Marshal.Copy(...), um die Daten vorher in ein Byte-Array zu kopieren, dieses in der Schleife zu veränden und hinterher wieder zurückzukopieren:
38 ms
3) Direktes Zugreifen auf den Pointer in einem unsafe-Kontext:
22 ms
4) Verwendung von GetPixel() und SetPixel():
3598 ms

Beitrag wurde zuletzt am 28.12.11 um 16:24:55 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Bild invertieren2.077jan8828.12.11 11:22
Re: Bild invertieren1.413ModeratorDaveS28.12.11 11:36
Re: Bild invertieren1.429jan8828.12.11 12:02
Re: Bild invertieren1.450jan8828.12.11 12:39
Re: Bild invertieren1.468Preisser28.12.11 13:46
Re: Bild invertieren1.389jan8828.12.11 14:46
Re: Bild invertieren1.465Manfred X28.12.11 14:56
Re: Bild invertieren1.550Preisser28.12.11 16:01
Re: Bild invertieren1.412Manfred X28.12.11 16:48
Re: Bild invertieren1.434Manfred X28.12.11 14:21
Re: Bild invertieren1.403jan8828.12.11 15:46
Re: Bild invertieren1.452jan8830.12.11 20:30
Re: Bild invertieren1.445Preisser30.12.11 20:39
Re: Bild invertieren1.388jan8830.12.11 20:58
Re: Bild invertieren1.420Manfred X31.12.11 09:22

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel