jak rysować za pomocą scanline

0

zablokowałem bitmapę i teraz nie wiem jak rysować. Poda ktoś przykładowy kod?

1

F1!</img>

1

Co jak co, ale człowiek tak opornie broniący się przed korzystaniem z wyszukiwarki programistą zostać nie może.

0
 unsafe
               {
                   byte* ptrData = (byte*)bmpData.Scan0;
                   int offsetData = bmpData.Stride - bmpData.Width * 3;

                for (int y = 0; y < bmp.Height; y++)
                    for (int x = 0; x < bmp.Width; x++) 
                    {
                        //co dalej?
                    }
               }
0

Powinieneś przesuwać się bajtami po ptrData i interpretować je zgodnie z formatem, który wybrałeś przy lockbits, a nie pikselami. Ta zmienna offsetData też jest dziwna, bo najprawdopodobniej będzie wynosić zero (stride to długość w bajtach jednego wiersza - scanline).

0
unsafe
               {
                   byte* ptrData = (byte*)bmpData.Scan0;
                   int offsetData = bmpData.Stride - bmpData.Width * 3;
 
                for (int y = 0; y < bmp.Height; y++)
                    for (int x = 0; x < bmp.Width; x++) 
                    {
                        *(ptrData + (y * bmpData.Stride) + (x * 3))=122; 
                    }
               }

W takim podejściu offset jest niepotrzebny. Czy dobrze rozumiem?

1

Tak.

0

Dlaczego kod:

unsafe
               {
                   byte* ptrData = (byte*)bmpData.Scan0;
                   int offsetData = bmpData.Stride - bmpData.Width * 3;

                for (int y = 0; y < bmp.Height; y++)
                    for (int x = 0; x < bmp.Width; x+=3) 
                    {
                        //wskaźnik na pierwszy piksel
                        *(ptrData + (y * bmpData.Stride) + (x * 3))=Color.DarkGray.B;
                        *(ptrData + (y * bmpData.Stride) + ((x+1) * 3)) = Color.DarkGray.G;
                        *(ptrData + (y * bmpData.Stride) + ((x+2) * 3)) = Color.DarkGray.R;
                    }
               }

nie wyświetla mi koloru szarego?

1

Nie powinno tam być:

                        *(ptrData + (y * bmpData.Stride) + (x * 3))=Color.DarkGray.B;
                        *(ptrData + (y * bmpData.Stride) + ((x * 3)+1) = Color.DarkGray.G;
                        *(ptrData + (y * bmpData.Stride) + ((x * 3)+2) = Color.DarkGray.R;
3

Ale po co ta cała arytmetyka (z jej powodu popełniłeś pomyłkę!). Wystarczy przesuwać sobie wskaźnik o jeden bajt/linię, coś na ten kształt:

	byte* scanLine = (byte*)bmpData.Scan0;

	for (int y = 0; y < bmp.Height; y++)
	{
		byte* ptr = scanLine;
		for (int x = 0; x < bmp.Width; x++) 
		{
			*ptr++ = Color.DarkGray.B;
			*ptr++ = Color.DarkGray.G;
			*ptr++ = Color.DarkGray.R;
		}
		scanLine += bmpData.Stride;
	}

Dodatkowo Stride może być ujemne - wtedy kolejność wierszy jest odwrócona. Trzeba to wziąć pod uwagę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1