[.net]System.Drawing.Bitmap genereren en weergeven

Pagina: 1
Acties:

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 02:25
Van de hoofdpanel van onze GIS-applicatie wil ik een screenshot maken, zodat deze in een preview venstertje kan worden weergegeven.
Bij het testen hiervan heb ik de bitmap netjes op schijf bewaard, en het resultaat is een keurige bitmap met het juiste resultaat.

De volgende stap is om de zojuist gegenereerde bitmap rechtstreeks op een preview panel te plaatsen. Hierbij ben ik enkele problemen tegengekomen.

Kort samengevat is dit het volgende wat ik doe:

C#:
1
2
3
4
5
6
Bitmap _previewBitMap;
_previewBitmap = GetBitMap(GetMaximumExtents());
using (Graphics g = _previewPanel.CreateGraphics())
{
  g.DrawImage(_previewBitmap,this.ClientRectangle);
}


Het resultaat is een lege previewpanel, niet goed dus.

Doe ik nu het volgende, dan gaat het wél goed:

C#:
1
2
3
4
5
6
7
8
Bitmap _previewBitMap;
_previewBitmap = GetBitMap(GetMaximumExtents());
_previewBitmap.Save(@"c:\blaat.bmp",ImageFormat.Bmp);
Bitmap bitmapje = new Bitmap(@"c:\blaat.bmp");
using (Graphics g = _previewPanel.CreateGraphics())
{
  g.DrawImage(bitmapje,this.ClientRectangle);
}


8)7

Het resultaat is een previewpanel met een screenshot van de hoofdpanel.

Tuurlijk, zo werkt het ook wel, maar het is enorm slordig. Ik heb de bitmap api doorgelezen, maar kan niks interessants vinden waarmee ik het eerste stuk code werkende kan maken, zonder een save-tussenstap te maken.
Heeft iemand een idee?

Verwijderd

Wel wazig... Kan je 'm niet via een MemoryStream saven en daarna daarna weer loaden? Wel ff Flush() aanroepen en Position op 0 zetten voor 'm te loaden.

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 02:25
het liefst wil ik hem juist helemaal niet saven, maar rechtstreeks vanuit het geheugen op m'n panel plaatsen. Dit moet toch wel te doen zijn?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Boktor schreef op 11 september 2004 @ 10:44:
het liefst wil ik hem juist helemaal niet saven, maar rechtstreeks vanuit het geheugen op m'n panel plaatsen. Dit moet toch wel te doen zijn?
Met een memorystream doe je dat ook.

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 02:25
questa schreef op 11 september 2004 @ 10:56:
[...]


Met een memorystream doe je dat ook.
hmm.. ik krijg het niet helemaal voor elkaar om een object in een memorystream te plaatsen. Kun je misschien uitleggen hoe je dit doet?

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 02:25
Soms is dit vak niet goed voor je bloeddruk:

Uiteindelijk bleek dus dat bij conversie van de bitmap image van de ActiveX component naar de System.Drawing.Bitmap de kleur verkeerd werd overgenomen:

C#:
1
2
3
4
5
6
7
8
9
10
11
public static System.Drawing.Color IntToColor(int color)
        {
            int alpha = color/(256*256*256);
            color -= (256*256*256)*alpha;
            int blue = color/(256*256);
            color -= (256*256)*blue;
            int green = color/256;
            color -= 256*green;
            int red = color;
            return System.Drawing.Color.FromArgb(alpha,red,green,blue);
        }


de laatste regel moet dus dit worden:

code:
1
return System.Drawing.Color.FromArgb(255-alpha,red,green,blue);

De alpha werd dus verkeerd overgenomen. Elke pixel werd namelijk wit gemaakt. 8)7 Dat maakt volgens mij deze methode nutteloos, aangezien ik dan dit getal rechtstreeks in de constructor van de System.Drawing.Bitmap kan prakken.[
Niet dus, de alpha van System.Drawing.Color is geinverteerd ten opzichte van de color standaard binnen mijn ActiveX component.

[ Voor 10% gewijzigd door JeroenTheStig op 13-09-2004 14:36 ]

Pagina: 1