[C#]BMP exporteren uit resources

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • naaitsab
  • Registratie: Augustus 2005
  • Laatst online: 15-09 08:23
Beste programmeurs :Y) ,
Voor mn werk ben ik bezig in 'VS2010 ultimate' een .NET 3.0 programma te schrijven om een aantal functies uit te voeren.
Ik loop echter vast op een probleem met de OEM informatie.

In het project heb ik een oemlogo.bmp bestand geinporteerd met de volgende opties:
code:
1
2
3
Build Action: Embedded Resource
Copy to Output directory: Copy Always
//rest is standaard//


Ik wil echter de bmp naar de system32 map verplaatsen om overeen te komen met de register sleutels die verderop in het programma naar het register worden geschreven.

Na vele uren zoeken en klooien heb ik de volgende code gevonden:
C#:
1
2
3
Bitmap logo = new Bitmap(Properties.Resources.oemlogo); //bestand heet oemlogo
logo.Save(@"C:\oemlogo.bmp"); //tijdelijke opslag in C:/ om makkelijk te controleren
textBox1.Text = string.Format("OEM logo gekopieërd");


Deze code exporteerd wel een oemlogo.bmp naar de c:/ maaar deze is 6 kb (origineel is 118kb) en als ik de bmp wil openen in photoshop krijg ik een waarschuwing dat de file format module het bestand niet kan parsen en ik krijg dus geen plaatje te zien. Echter als ik de bmp open met windows photoviewer krijg ik gewoon het logo te zien.
Als ik het 6kb bestand naar system32 verplaats en ik herstart explorer krijg ik geen logo (rest van de oem info staat er wel gewoon) maar als ik het origineel (wat in resources staat) naar system32 kopieer en ik herstart explorer dan staat het logo gewoon bij de OEM informatie zoals het hoort.

Als ik de exe op een andere pc test krijg ik dezelfde 6kb bmp te zien in de C:/ dus hij neemt de resource wel mee in de exe zelf.

Ik heb al gekeken naar de 'allbytes' methode maar daar krijg ik problemen mee om de bytes naar de byte[] array te schrijven omdat het een bitmap en geen exe/txt betreft volgens de compiler.

PS. Ik ben een beginnende C# programmeur dus gelieve hier een beetje rekening mee te houden ;)

if (!coffee) {
Work = false; }


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

naaitsab schreef op zaterdag 18 februari 2012 @ 12:09:
C#:
1
2
3
Bitmap logo = new Bitmap(Properties.Resources.oemlogo); //bestand heet oemlogo
logo.Save(@"C:\oemlogo.bmp"); //tijdelijke opslag in C:/ om makkelijk te controleren
textBox1.Text = string.Format("OEM logo gekopieërd");
Waarschijnlijk snapt 'hij' het niet omdat het helemaal geen windows bitmap (BMP) is. Wellicht kun je gebruik maken van de ImageFormat overload die de klasse aanbied? MSDN: Image.Save Method (String, ImageFormat) (System.Drawing)
http://msdn.microsoft.com/en-us/library/ktx83wah.aspx:
If no encoder exists for the file format of the image, the Portable Network Graphics (PNG) encoder is used. When you use the Save method to save a graphic image as a Windows Metafile Format (WMF) or Enhanced Metafile Format (EMF) file, the resulting file is saved as a Portable Network Graphics (PNG) file.

Acties:
  • 0 Henk 'm!

  • naaitsab
  • Registratie: Augustus 2005
  • Laatst online: 15-09 08:23
Hmm dus het zou dan zoiets worden:
C#:
1
2
3
4
5
// Construct a bitmap from the image resource.
Bitmap bmp1 = new Bitmap(Properties.Resources.oemlogo), "oemlogo.bmp");

    // Save the image as a BMP.
    bmp1.Save("c:\\oemlogo.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

Of heb ik je verkeerd begrepen?


edit:
Het is gelukt :9

Zal de code delen voor de liefhebber:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Construct a bitmap from the button image resource. 
Stream s = this.GetType().Assembly.GetManifestResourceStream("**NAMESPACE**.Resources.oemlogo.bmp");
Bitmap bmp1 = new Bitmap(s);
Graphics g = Graphics.FromImage(bmp1);
g.DrawImage(bmp1, new Point(0, 0));
g.Dispose();
         
           // Save the image as a BMP. 
              bmp1.Save(@"c:\oemlogo.Bmp", System.Drawing.Imaging.ImageFormat.Bmp);
              bmp1.Dispose();
               s.Close();

                textBox1.Text = string.Format("OEM logo gekopieërd");

[ Voor 50% gewijzigd door naaitsab op 18-02-2012 19:42 ]

if (!coffee) {
Work = false; }


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
Waarom?
C#:
1
textBox1.Text = string.Format("OEM logo gekopieërd");


Dit is toch wel voldoende
C#:
1
textBox1.Text = "OEM logo gekopieërd";

Acties:
  • 0 Henk 'm!

  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 07:03
Het liefst nog zonder trema ook. ;)

^ Wat hij zegt.


Acties:
  • 0 Henk 'm!

  • naaitsab
  • Registratie: Augustus 2005
  • Laatst online: 15-09 08:23
4Real schreef op zaterdag 18 februari 2012 @ 23:15:
Waarom?
C#:
1
textBox1.Text = string.Format("OEM logo gekopieërd");


Dit is toch wel voldoende
C#:
1
textBox1.Text = "OEM logo gekopieërd";
Geen idee eigenlijk :+
Verderop gebruik ik enviroment.Newline daarbij is string.Format wel handig dacht ik.
textBox1 is ook fout natuurlijk maar eerst het lastigste werkend krijgen en daarna de schoonheidsfoutjes eruit werken.

Nu nog kijken of ik bovenstaande code kan toepassen voor een jpg wallpaper.

if (!coffee) {
Work = false; }

Pagina: 1