Forums Neueste Beiträge
 

ANN: MSDN-Beispiel

26/06/2008 - 10:03 von Karsten Sosna | Report spam
Hallo NG,
hier mal wieder ein Beispiel, das veranschaulicht, dass man nicht alles
glauben sollte was in der MSDN steht
http://msdn.microsoft.com/de-de/lib...29672.aspx

Hier befindet sich im Code folgendes:
\\\
Dim bmp As New Bitmap(".\test.bmp")

' Specify a pixel format.
Dim pxf As PixelFormat = Pixelformat.Format24bppRgb
///
Bis dahin noch nichts ungewöhnliches, aber dann folgt:
\\\
Dim bmpData As BitmapData = bmp.LockBits(rect, _
ImageLockMOde.ReadWrite, pxf)
///
Es gibt aber keine Hinweis darauf, das die Datei auch das Format24bppRgb
besitzen muss. Ergo wàre hier richtig:
\\\
Dim bmpData As BitmapData = bmp.LockBits(rect, _
ImageLockMOde.ReadWrite, bmp.PixelFormat)
///
Weiter unten gibt es den nàchsten Fehler:
\\\
Dim numBytes as Integer = bmp.Width * bmp.Height * 3
///
Dadurch das man das PixelFormat Format24bppRgb zugrunde gelegt hat sollte
man schon die Ausrichtung auf 4 Bytes(32Bit berücksichtigen, also:
\\\
Dim numBytes as Integer = bmpData.Width * bmpData.Stride
///
Und dann die Deklaration des Arrays wie folgt vornehmen:
\\\
Dim rgbValues(numBytes - 1) As Byte
///
Dann gibt es nàmlich auch hier kein Problem:
\\\
For counter As Integer = 0 To rgbValues.Length Step 6
rgbValues(counter) = 255
Next counter
///

Empfinde ich persönlich schon als erschütternd so etwas unter dem Thema
"Gewusst wie" abzulegen. Ich weiß dass das Thema LockBits und das Bearbeiten
der Daten nicht trivial ist, aber genau aus diesem Grund sollte man doch
etwas spezieller darauf eingehen oder zumindest einen Hinweis darauf geben
wie die Daten bei unterschiedlichen Pixelformaten vorliegen.
Gruß Scotty
 

Lesen sie die antworten

#1 Joachim Fuchs
26/06/2008 - 10:30 | Warnen spam
Hallo Karsten,

ich glaube, Du hast übersehen, dass der Artikel offenbar für das Compact
Framework geschrieben wurde:

Es gibt aber keine Hinweis darauf, das die Datei auch das Format24bppRgb
besitzen muss. Ergo wàre hier richtig:
\\\
Dim bmpData As BitmapData = bmp.LockBits(rect, _
ImageLockMOde.ReadWrite, bmp.PixelFormat)



nein, das geht nicht. Warum nicht, steht ja oben drüber:
"Da .NET Compact Framework die PixelFormat-Eigenschaft von Image nicht
unterstützt, müssen Sie den Wert für das Pixelformat mithilfe des
format-Parameters in LockBits explizit angeben."

///
Weiter unten gibt es den nàchsten Fehler:
\\\
Dim numBytes as Integer = bmp.Width * bmp.Height * 3
///
Dadurch das man das PixelFormat Format24bppRgb zugrunde gelegt hat sollte
man schon die Ausrichtung auf 4 Bytes(32Bit berücksichtigen, also:
\\\
Dim numBytes as Integer = bmpData.Width * bmpData.Stride



meintest Du vielleicht bmp.Height * bmpData.Stride? Stride ist ja die Anzahl
der Bytes pro Zeile

///
Und dann die Deklaration des Arrays wie folgt vornehmen:
\\\
Dim rgbValues(numBytes - 1) As Byte



Da hast Du Recht :-) Vermutlich hat das jemand aus C# nach VB übersetzt und
die Array-Anomalien von VB übersehen.

Aber andererseits:

Auch wenn wir ein paar Beispiele dazu im VB-Codebook haben, halte ich
dennoch die Bildbearbeitung mit VB für relativ sinnlos. Das Problem ist,
dass man, um auf die einzelnen Bytes zugreifen zu können, erst einmal mit
Marshal.Copy alle in ein Array kopieren muss (und spàter wieder zurück).
Damit verdoppelt sich nicht nur der Speicherbedarf, sondern das kostet auch
Zeit. Auch der Array-Zugriff ist nicht so schnell wie eine Zeigeroperation.
Die andere Alternative, mit Marshal.GetByte etc. auf die Bytes zuzugreifen,
dauert noch lànger.

Hier hat C# ganz klar die Nase vorn, da man mit Zeigern sehr performant die
jeweiligen Algorithmen umsetzen kann. Beim Compact Framework làsst sich
allerdings noch eine Steigerung erzielen, wenn man dieselben
Zeigeroperationen in eine C-DLL auslagert.

Gruß
Joachim


Dr. Joachim Fuchs - Autor - Dozent - Softwarearchitekt
MCT - MCAD
http://www.fuechse-online.de/beruflich/index.html -
http://vbnet.codebooks.de

Ähnliche fragen