Utworzenie bitmapy z bit array.

0

Próbuje utworzyć jak najszybszy kod do konwersji bit array na bitmapę. Znalazłem coś takiego, ale nie mam zielonego pojęcia czemu nie działa.

   Size size = new Size(30,44);
   int stride = 1*size.Width;  // 1 - ilosc bajtow/pixel
   byte[] array = Enumerable.Repeat((byte)120, size.Width*size.Height).ToArray(); // 120 - jakiś kolor
   Bitmap myBitmap = new Bitmap(size.Width, size.Height, stride, PixelFormat.Format8bppIndexed, Marshal.UnsafeAddrOfPinnedArrayElement(array, 0));
 

Krzyczy, że nie zgadza mu się argument w funkcji z ostatniej linijki. Obstawiam ostatni, ale dlaczego? Przecież ta funkcja zwraca IntPtr... Jakieś pomysły?

0

Podejrzewam, że byte[] nie jest typu Array.

Zobacz drugi przykład: https://msdn.microsoft.com/en-us/library/system.array%28v=vs.110%29.aspx#Anchor_7

0
Spine napisał(a):

Podejrzewam, że byte[] nie jest typu Array.

Zobacz drugi przykład: https://msdn.microsoft.com/en-us/library/system.array%28v=vs.110%29.aspx#Anchor_7

No nie jest i nie musi być. Pisząc array miałem na myśli po prostu tablicę a nie typ Array. Problem częściowo rozwiązałem - nie zgadzała mu się wartość stride. Znalazłem jakiś wzór na necie i niby działa, ale jakoś do mnie nie przemawia. Myślałem, że stride to po prostu offset w byte'ach między kolejnymi wierszami bitmapy, a tu guzik prawda ^^ Teraz muszę się jeszcze uporać z tym, że mi bitmapę zapisuje w formie RGB i wyświetla jakieś różne dziwne kolory, a mam przecież tylko 8 bitów/pixel, czyli teoretycznie grayscale. Pokombinuję jutro z paletą kolorów jeszcze, wydaje mi się, że to tam może leżeć problem.

0

Po pierwsze to opis UnsafeAddrOfPinnedArrayElement mówi

The array must be pinned using a GCHandle before it is passed to this method. For maximum performance, this method does not validate the array passed to it; this can result in unexpected behavior.

Bez tego może ci działa - dzisiaj, a jutro przestanie: “unexpected behavior”.

Po drugie, stride musi być zaokrąglone w górę do wielokrotności 4. Dane też muszą być w ten sposób ułożone.

Przestań kombinować, a czytaj dokumentację.

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