Laden...

Bitmap.GetHbitmap() ändert den bitcounter des Bildes

Erstellt von doubleII vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.580 Views
D
doubleII Themenstarter:in
33 Beiträge seit 2016
vor 7 Jahren
Bitmap.GetHbitmap() ändert den bitcounter des Bildes

Hallo zusammen, ich habe folgendes Problem. Ein 8 Bit Bitmap image wird in BmpSource1 gespeichert. Das Bild übergebe ich weiter an dem Pointer Bmp mit Hilfe der GetBitmap() Methode.
Hier wird interessant. Das Bild wird 32 Bit. Hat jemand eine Idee, wie kann ich das Bild an dem Pointer übergebe ohne das Format zu ändern?

     

using HBITMAP = System.IntPtr;

public HBITMAP[] Bmp { get; private set; } = new HBITMAP[6];

DepthSVB1 = Image.GetPixelFormatSize(BmpSource1.PixelFormat); //8 Bit Image
Bmp[0] = BmpSource1.GetHbitmap(); // GetBitmap() gibt ein 32 Bit Bild zurück oder?  
Bitmap bitmaps = Image.FromHbitmap(Bmp[0]); 
DepthSVB2 = Image.GetPixelFormatSize(bitmaps.PixelFormat); // ich überprüfe das Format wieder. Hier wird 32 Bit Image.

Warum passiert das, kann mir jemand erklären?

Schöne Grüße
doubleII

16.834 Beiträge seit 2008
vor 7 Jahren

Wie man im Quellcode nachsehen kann (sollte man immer tun, wenn man nicht weiß, wieso eine Methode anders reagiert, als man denkt), erzeugt GetHBitMap mit Hilfe der Win32 APi und der gdi32.dll ein neues Bitmap-Objekt, das per default an dieser Stelle 32 bittig ist.

Vermutlich wirst Du hier direkt mit der Win32 API (also über PInvoke) arbeiten und auf System.Drawing verzichten müssen.
Ich vermute jetzt einfach mal, dass Windows immer Bitmaps erzeugt, mit dem es auch direkt was anfangen kann (eben im Bildkontext 32 Bit) und nicht 8 Bit.

D
doubleII Themenstarter:in
33 Beiträge seit 2016
vor 7 Jahren

ja genau voller Treffer. Ich muss mit win32 API arbeiten. Es wird eine nicht verwaltete Funktion, die in einer Dll Datei implementiert ist, aufgerufen.
sie lautet :


//Deklaration
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl,")]
public static extern int Execute(int count, [MarshalAs(UnmanagedType.LPArray)] HBITMAP[] bitmaps);


private void btnExecute(object sender, EventArgs e)
{
       
       Bmp[0] = GetHbitmap();   
           
       Execute(count, Bmp);
}

ich verstehe immer noch nicht wie ich das machen muss.

😦 .

Vielen Dank!

Schöne Grüße
doubleII