Lockbit fehler?


13.10.2020, 09:08

Sperre von den Links entfernt


13.10.2020, 09:15
Einzig alleine das ich eventuell nicht 2 LockBit Funktionen parallel laufen lassen darf würde mir einfallen. Aber ob das stimmt weiß ich nicht.

Kann ich entkräften. Hab es gerade in der Funktion getestet, die nach Abschluss der Threads über ein Event aufgerufen wird.

Dort sind alle Speicher bereits freigegeben, und keine weitere Threads am laufen. Demnach muss in meiner LockBit Methode ein Fehler sein.

Code kann nicht angezeigt werden. Login ist erforderlich.

Hier den Code von dem LockBit Sub. Die SetPixel Methode ist eh unwichtig

https://pastebin.com/mBHnp8CD

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Laut Documentation wird der Stride auf ein Vielfaches von 4 gerundet.

Leider geht aus der Documentation nicht hervor, ob dadurch Padding pro Zeile, Pro Pixel oder Pro Bitmap entsteht. In den ersten zwei Fällen würde dein Program aber falsche Ergebnisse liefern, da die Position falsch berechnet wird.

https://docs.microsoft.com/en-us/dotnet/api/system.drawing.imaging.bitmapdata.stride?view=dotnet-plat-ext-3.1

Kommt hin, mit 3bpp komme ich mit Stride auf 796. Wenn ich aber die Breite mal 3 nehme, bleibt ein Byte übrig. Auf die Höhe gerechnet, hätte ich dann 265 Bytes die zu viel wären. Schein also mit dem Pixelformat der bitmap zusammen zuhängen. Nur hätte ich gerne R,G,B Töne. Die 265 * 265 Bytes für Alpha Töne könnte ich eigentlich einsparen.

1
@VoltarenGel

Jetzt musst du nur noch herausfinden, wo da ein Bit mehr verwendet wird. Ich darauf, dass das pro Zeile geschieht. Folglich schlicht Statt

y * bmp.Width * btps

direkt mit dem Stride rechnen.

1
@Destranix
  Private bmp_clr_Palette As New Bitmap(rct_clr_Pallette.Width, rct_clr_Pallette.Height, PixelFormat.Format24bppRgb)

und die Position mit :

position = ((y * bmpData.Stride) + (x * btps)

Funktionieren. Nun, komme ich so aber zu der Frage, warum funktioniert der vorherige Code, in meiner Klasse ohne Probleme? Ist mir unerklärlich.

Wobei, könnte es evt. damit zusammenhängen dass mein Farbverlauf den ich hier erstellen wollte in Breite/Höhe = 265 sind. Und in meiner Klasse das Bild 1.5k/1k groß ist. ?

1
@VoltarenGel

Wenn der Stride bereits durch 4 teilbar ist, dann hast du keine Rundung und es tritt kein fehler auf. Das hängt also von der verwendeten Bitmap ab sowie vom verwendeten Format.

1
@Destranix

Ich danke euch. Die Position werde ich ab sofort nur noch über Stride berechnen. Wird mir bestimmt viel Zeit für die Fehlersuche ersparen^^

1
Von Experte Destranix bestätigt

Das Einzige, was mir auffällt, ist, dass Du zwar die Puffergröße über "Stride" berechnest, die Pixelposition im Array dann aber über bmp.Width und btps.

Nun das liegt doch daran, wie die Bitmap zerschnitten wird, und dann im Speicher abgelegt wird. Demnach gibt mir Stride die bytes in der horizontalen Länge.

Hier sollten 24bppRgb gemnach 3 Bytes entsprechen. Dafür dann auch die Variabel btps.

Ich verstehe es halt nicht, weil alle anderen Controls auf meiner Form ( außer die 3Scrollbaren und die Checkbox) werden über LockBits erstellt, und über die Form Paint Events entsprechend gezeichnet. Und dort funktioniert alles ohne Probleme, über genau die gleiche Methode.

0
@VoltarenGel

Ja, ich kenne das im Endeffekt auch nur so, dass Stride und bmp.Width eigentlich sogar auf denselben Wert hinauslaufen, aber das ist das Einzige, was mir erklären würde, wie dieser Offset zustandekommt.

1
@VoltarenGel

Schaust du bitte mal hier, die Variabel in der Überwachung.

Bild

Warum da 1 Byte mehr ist, verstehe ich gerade auch nicht. Sollten eigentlich 795 sein, wenn ich mich da jetzt nicht irre.

1
@VoltarenGel

Ich mache es normalerweise so, dass ich manuell einen entsprechend großen Byte-Puffer erzeuge, diesen beschreibe und dann nur noch nach dem LockBits rüberkopiere.

1
@VoltarenGel

Ja, wie ich mir dachte, es liegt am Offset. Auch wenn ich es gerade noch nicht ganz verstehe.

Habe das Format von 3x1Byte für R,G,B zu 4x1Byte zu R,G,B,A gewechselt. Siehe da, mit dem Offset von 4 funktioniert es plötzlich.

1