[c#] bitmap lockbits doet iets wat ik niet verwacht

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Ik heb een plaatje van 658*492 pixels in 1 kleur (R: 242, G: 199, B: 131).

Deze wil ik doorlopen met de lockbits:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 unsafe {
                Rectangle bounds = new Rectangle(Point.Empty, bitmap.Size);
                
                BitmapData bitmapData = bitmap.LockBits(bounds, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                
                Byte* pBase = (Byte*)bitmapData.Scan0.ToPointer();
               try {
                   
                    byte y, u, v;
                    int destIndex = 0;
                    int maxSize = width * height * 3;   // 3 bytes per pixel in RGB (little endian)
                    for (int i = 0; i < maxSize; i += 3)
                    {
                        if (pBase[i + 2] != 242 || pBase[i + 1] != 199 || pBase[i + 0] != 131)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                        
                    }
                } 
                finally 
                {
                    bitmap.UnlockBits(bitmapData);
                }
            }


Nu zo hij dus nooit bij de break mogen komen. Alleen doet hij dat wel. De RGB waarden wat dan opeens
(0,0,131) en vanaf dan zit er een verschuiving in. DIt is precies na de eerste lijn.

Ik dacht altijd dat het een byte array was van breedte*hoogte*aantalbytesperpixel en dat ik hier zo doorheen kan lopen.

Heeft iemand een idee hoe dit komt en hoe ik dit kan voorkomen? Voorbeeldn van MSDN gaan ze ook van 3 bytes per pixel uit, alleen kopieren ze hem eerst. Volgens mij moet dat niets uitmaken.

if broken it is, fix it you should


Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 22:46
elgringo schreef op maandag 23 februari 2009 @ 12:44:
Ik dacht altijd dat het een byte array was van breedte*hoogte*aantalbytesperpixel en dat ik hier zo doorheen kan lopen.
Dit is niet altijd zo, meestal om alignment redenen. In BitmapData.Stride staat hoeveel bytes een horizontale lijn is.

Acties:
  • 0 Henk 'm!

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
matthijsln schreef op maandag 23 februari 2009 @ 13:42:
[...]


Dit is niet altijd zo, meestal om alignment redenen. In BitmapData.Stride staat hoeveel bytes een horizontale lijn is.
Ik zie idd dat deze niet overeen komt met de breedte.. ga ik daar wel mee rekenen.

if broken it is, fix it you should


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Check mijn C# sourcecode die ook een buffer doorloopt mbv lockbits:
http://weblogs.asp.net/fbouma/archive/2005/12/25/433976.aspx

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Bitmap pixelrijen zijn typisch 4-byte aligned. De verschuiving van 2 bytes is dus niet vreemd - 658*3 mod 4 = 2. Idd altijd uitgaan van de stride (die zal je ook helpen als je een rect lockt die kleiner is dan de surface) :)

[ Voor 20% gewijzigd door .oisyn op 23-02-2009 15:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Ik zie dat je 24bpp gebruikt, dus iedere pixel is 3 bytes, en niet 4 (en dus de error). Ik weet niet hoeveel operaties je doet op je data, maar wellicht intern eerst even converteren naar 32bpp en dan de buffer consumeren :)

[ Voor 4% gewijzigd door EfBe op 23-02-2009 18:22 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1