Hi,
Ich habe mir bereits den Artikel
"GetPixel und SetPixel um Längen geschlagen. 800 mal schneller " durchgelesen.
Dadurch und aus einigen weiteren Foren habe ich mir eine Bitmapk-Klasse gebaut, die mir per LockBits den Zugriff auf einzelne Pixel gewährt.
Nun greife ich unsafe auf einen Pointer (pBase) zu, den ich per bitmap.Scan0 initialisiere.
Jeder Pixel entspricht zwei Bytes (PixelFormat.Format16bppRgb555) wobei für mich jeweils nur das zweite Byte interessant ist.
Meine Funktion zum Pixel auslesen sieht wie folgt aus:
[highlight=c#]
public byte GetPixelstate(int x, int y)
{
return (byte)*(pBase + y * PictureWidth + x *2 +1);
}
[/highlight]
Leider ist für mich das Auslesen hierdurch immer noch zu langsam.
Wenn ich beispielsweise bei einem Bild mit 40000x3000 Pixeln, jeden Pixel einmal auslese benötige ich hierfür 5028 ms.
Wenn ich mir ein 2D-byte-Array erstelle, das aus 40000 Spalten und 3000 Zeilen besteht und dort jede Zelle einmal auslese benötigt das nur noch 1223 ms
Meine Frage wäre, wodurch ich so viel Zeit verliere? Ich dachte, wenn ich unsafe mit einem Zeiger arbeite, dass ich dann so schnell seim müsste wie mit einem Array.
Gibt es Funktionen, um noch schneller zu werden?
Würde es helfen per dllImport die gdi32.dll einzubinden und deren Funktionen zu verwenden?
Vielen Dank Hannes
Ich habe mir bereits den Artikel
"GetPixel und SetPixel um Längen geschlagen. 800 mal schneller " durchgelesen.
Dadurch und aus einigen weiteren Foren habe ich mir eine Bitmapk-Klasse gebaut, die mir per LockBits den Zugriff auf einzelne Pixel gewährt.
Nun greife ich unsafe auf einen Pointer (pBase) zu, den ich per bitmap.Scan0 initialisiere.
Jeder Pixel entspricht zwei Bytes (PixelFormat.Format16bppRgb555) wobei für mich jeweils nur das zweite Byte interessant ist.
Meine Funktion zum Pixel auslesen sieht wie folgt aus:
[highlight=c#]
public byte GetPixelstate(int x, int y)
{
return (byte)*(pBase + y * PictureWidth + x *2 +1);
}
[/highlight]
Leider ist für mich das Auslesen hierdurch immer noch zu langsam.
Wenn ich beispielsweise bei einem Bild mit 40000x3000 Pixeln, jeden Pixel einmal auslese benötige ich hierfür 5028 ms.
Wenn ich mir ein 2D-byte-Array erstelle, das aus 40000 Spalten und 3000 Zeilen besteht und dort jede Zelle einmal auslese benötigt das nur noch 1223 ms
Meine Frage wäre, wodurch ich so viel Zeit verliere? Ich dachte, wenn ich unsafe mit einem Zeiger arbeite, dass ich dann so schnell seim müsste wie mit einem Array.
Gibt es Funktionen, um noch schneller zu werden?
Würde es helfen per dllImport die gdi32.dll einzubinden und deren Funktionen zu verwenden?
Vielen Dank Hannes
Comment