Autor Beitrag
doubleII
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Di 11.10.16 15:06 
Hallo,

ich habe eine Frage. Ich habe ein 8 Bit Bitmap-Image und das Image will ich an einem IntPtr übergeben. Wenn ich die Methode GetHbitmap() benutze, erstellt sie mir ein GDI-Bitmapobjekt aus dieser Bitmap, der aber 32 Bit ist (Standard). Wie kann ich ein 8 Bit GDI-Bitmapobjekt erstellen?

Schöne Grüße
doubleII
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 11.10.16 15:47 
- Nachträglich durch die Entwickler-Ecke gelöscht -
doubleII Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Di 11.10.16 16:30 
Danke, das habe schon ausprobiert. Das Problem ist, wenn ich die Bilder so übergebe, es zeigt keine Bilder auf dem Bildschirm.
:(
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Di 11.10.16 19:05 
Tach,

dass du nix auf dem Bildschirm siehst liegt daran, dass der Pointer ungültig wird. Du kannst nicht das Bild sperren, dir den Pointer holen und dann das Bild wieder freigeben. Wenn du es mit Pointer machen willst, musst du - was auch immer du vorhast - den Pointer verwenden, bevor du das Bild freigibst:
IntPtr ptr;
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
using (Bitmap bmp = new Bitmap(@"C:\"))
{
    BitmapData data = bmp.LockBits(new Rectangle(00, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
    ptr = data.Scan0;

    // hier den Pointer verwenden

    bmp.UnlockBits(data);
}


Aber wieso willst du denn mit dem Pointer arbeiten?

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
doubleII Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Mi 12.10.16 09:15 
Hallo,

ich habe zwei externe Funktionen, die sind in Delphi geschrieben.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
 [DllImport( "VisionToolbox.dll",
             CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Execute")]
        public static extern int Execute(int count, ref HBITMAP[] bitmaps);
[DllImport( "VisionToolbox.dll",
             CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        public static extern HWND ShowUserInterface(ref HWND hwnd, bool show, bool setupmode);

Die erste Funktion wertet das Bild aus (Bsp. Länge, Höche des Objektes). Die zweite lässt das Bild auf das Bildschirm zeigen.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  private void btnExecute_Click(object sender, EventArgs e)
        {
            IntPtr[] hbitmap = new IntPtr[1];
            Bitmap bmp = new Bitmap(@"C:\");

            if(bmp != null)
            {   
               count = hbitmap.Length;
               hbitmap[0] = bmp.GetHbitmap(); // GetHbitmap erstellt ein 32 Bit Standard-Bitmapobjekt
               Execute(counter, ref hbitmap);

            }
            DelegateObject(hbitmap[0]);
        }

Ich habe erst mit GetHbitmap() Methode versucht. Es hat alles funktioniert, aber ich habe 32 Bit Bilder auf dem Bildschirm, obwohl ich unter (Bitmap bmp) 8 Bit Image speichere. Da die Bilder zu groß sind(GetHbitmap erstellt ein 32 Bit Bitmapobjekt), dauert die Auswertung des Bildes sehr lang.

Deswegen versuche ich 8 Bit Intptr zu erstellen (Mit Hilfe von BitmapData). Leider funktionieren in diesem Fall die beiden Funktionen nicht, also weder Execute (liefert keine Ergebnisse) noch ShowUserInterface ( keine Bilder auf dem Bildschirm). :(
Vorschläge wie man das machen kann?

Vielen Dank!

Schöne Grüße
doubleII
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.10.16 19:13 
- Nachträglich durch die Entwickler-Ecke gelöscht -
doubleII Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Do 13.10.16 08:16 
Guten Morgen,

danke, aber wenn ich die GetHbitmap() Methode aufrufe, da ich Bitmap -> in hbitmap konvertieren muss, habe wieder eine 32 Bit hbitmap (GetHbimap erstellt Standard-Wert, der 32 Bit ist ). Wie erstelle ich 8 Bit hbitmap, kapiere ich immer noch nicht und finde auch nicht zum Thema. Das kann nicht sein! Wer kann mir etwas mehr Info zu Thema oder ein Tipp geben, wie ich das machen könnte.

Vielen Dank!


Schöne Grüße
doubleII
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 13.10.16 08:49 
Die Größe des IntPtr hat überhaupt nichts mit den Daten im Bitmap zu tun. Es ist eine Speicheradresse und die hat entweder 32 Bit oder 64 Bit, je nachdem, auf welchem System man ist und wie man kompiliert. Okay, falsch verstanden ;)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.10.16 11:15 
- Nachträglich durch die Entwickler-Ecke gelöscht -
doubleII Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Do 13.10.16 13:29 
Na ja Frühlingsrolle, Danke dir. Das Problem liegt darin, dass der pointer nicht auf ein Bitmap Wert, sondern auf BitmapData Wert zeigt. Wenn ich den Wert in die externe Execute Funktion übergebe, wird das Format unbekannt (bad image Pointer).


Zuletzt bearbeitet von doubleII am Do 13.10.16 22:17, insgesamt 2-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 13.10.16 20:26 
Möglicherweise hilft es hier wenn du erklärst was auf der anderen Seite der Funktion mit dem HBitmap passiert. Wird dort direkt mit dem GDI Object gearbeitet? Oder wird dort wieder ein Bitmap aus dem GDI Object erzeugt? Wenn ja mit welcher GDI Methode?
doubleII Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Sa 15.10.16 18:21 
Hallo Ralf,

ich muss externe dll einbinden. Was in den dll passiert, weiß ich selber nicht. Ich weiß nur , dass ich Bitmap in hbitmap konvertierne muss.
Wenn ich BitmapData verwende es zeigt mir bad image Pointer, also nach meiner Meinung wird das Format unbekannt.
Wenn man die Funktion (Execute) in c++ schreibt, habe gesehen, es wird nicht Bitmap sondern Cimage als Datentyp benutzt.

Schöne Grüße
doubleII