Autor |
Beitrag |
doubleII
Beiträge: 52
|
Verfasst: 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
|
Verfasst: Di 11.10.16 15:47
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
doubleII
Beiträge: 52
|
Verfasst: 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#
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: 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;
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| using (Bitmap bmp = new Bitmap(@"C:\")) { BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); ptr = data.Scan0;
bmp.UnlockBits(data); } |
Aber wieso willst du denn mit dem Pointer arbeiten?
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
doubleII
Beiträge: 52
|
Verfasst: Mi 12.10.16 09:15
Hallo,
ich habe zwei externe Funktionen, die sind in Delphi geschrieben.
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.
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(); 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
|
Verfasst: Mi 12.10.16 19:13
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
doubleII
Beiträge: 52
|
Verfasst: 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.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
|
Verfasst: Do 13.10.16 11:15
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
doubleII
Beiträge: 52
|
Verfasst: 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
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 52
|
Verfasst: 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
|
|
|