2012-08-13 13 views
5

Dopo aver passato molto tempo a fare ricerche su questo argomento su Google, non ho potuto trovare un esempio di conversione di un'immagine Wbmp in formato Png in C# Ho scaricato alcune immagini Wbmp da Internet e le sto visualizzando utilizzando un Editor binario.Come convertire Wbmp in Png?

Qualcuno ha un algoritmo che mi aiuterà in questo o qualsiasi codice aiuterà anche.

Le cose che so finora:

  1. primo byte è di tipo * (0 per le immagini in bianco e nero)
  2. Secondo byte è chiamato un “-header fisso” ed è 0
  3. terzo byte è la larghezza dell'immagine in pixel *
  4. Quarto byte è l'altezza dell'immagine in pixel *
  5. Dati byte disposti in righe: un bit per pixel: Quando la lunghezza di riga non è divisibile per 8, la riga è 0-imbottito per il limite di byte

sono pienamente perso quindi ogni aiuto sarà apprezzato


Alcuni degli altri codici :

using System.Drawing; 
using System.IO; 

class GetPixel 
{ 
    public static void Main(string[] args) 
    { 
     foreach (string s in args) 
     { 
     if (File.Exists(s)) 
     { 
      var image = new Bitmap(s); 
      Color p = image.GetPixel(0, 0); 
      System.Console.WriteLine("R: {0} G: {1} B: {2}", p.R, p.G, p.B); 
     } 
     } 
    } 
} 

E

class ConfigChecker 
{ 
    public static void Main() 
    { 
     string drink = "Nothing"; 
     try 
     { 
     System.Configuration.AppSettingsReader configurationAppSettings 
      = new System.Configuration.AppSettingsReader(); 
     drink = ((string)(configurationAppSettings.GetValue("Drink", typeof(string)))); 
     } 
     catch (System.Exception) 
     { 
     } 
     System.Console.WriteLine("Drink: " + drink); 
    } // Main 
} // class ConfigChecker 

processo:

  1. fatto ricerche su Wbmp

  2. Aprite X.wbmp per controllare i dettagli primi

  3. capire come trovare la larghezza e l'altezza del file WBMP (in modo che sia può in seguito scrivere il codice). Si noti che il modo più semplice per convertire una raccolta di byte di lunghezza (una volta che l'MSB è stato eliminato) consiste nel trattare l'entità come base-128.

  4. Guarda il codice di esempio che ho aggiornato.

  5. Sto cercando di creare un oggetto bitmap vuota e impostarne la larghezza e l'altezza a quello che abbiamo lavorato in (3)

  6. Per ogni bit di dati, cercherà di fare un SetPixel sull'oggetto Bitmap creato.

  7. 0s riempite quando la larghezza WBMP non è un multiplo di 8.

  8. Salva bitmap utilizzando il metodo Save().

Esempio di utilizzo dell'applicazione. Si presume che l'applicazione si chiami Wbmp2Png. Nella riga di comando:

Wbmp2Png IMG_0001.wbmp IMG_0002.wbmp IMG_0003.wbmp 

L'applicazione converte ciascuno di IMG_0001.wbmp, IMG_0002.wbmp e IMG_0003.wbmp in file PNG.

risposta

3

Questo sembra portare a termine il lavoro.

using System.Drawing; 
using System.IO; 

namespace wbmp2png 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      foreach (string file in args) 
      { 
       if (!File.Exists(file)) 
       { 
        continue; 
       } 
       byte[] data = File.ReadAllBytes(file); 
       int width = 0; 
       int height = 0; 
       int i = 2; 
       for (; data[i] >> 7 == 1; i++) 
       { 
        width = (width << 7) | (data[i] & 0x7F); 
       } 
       width = (width << 7) | (data[i++] & 0x7F); 
       for (; data[i] >> 7 == 1; i++) 
       { 
        height = (height << 7) | (data[i] & 0x7F); 
       } 
       height = (height << 7) | (data[i++] & 0x7F); 
       int firstPixel = i; 
       Bitmap png = new Bitmap(width, height); 
       for (int y = 0; y < height; y++) 
       { 
        for (int x = 0; x < width; x++) 
        { 
         png.SetPixel(x, y, (((data[firstPixel + (x/8) + (y * ((width - 1)/8 + 1))] >> (7 - (x % 8))) & 1) == 1) ? Color.White : Color.Black); 
        } 
       } 
       png.Save(Path.ChangeExtension(file, "png")); 
      } 
     } 
    } 
} 
3

Prova questo codice, funziona!

using System.IO; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Runtime.InteropServices; 

class WBmpConvertor 
{ 
    public void Convert(string inputFile, string outputFile, ImageFormat format) 
    { 
     byte[] datas = File.ReadAllBytes(inputFile); 
     byte tmp; 
     int width = 0, height = 0, offset = 2; 
     do 
     { 
      tmp = datas[offset++]; 
      width = (width << 7) | (tmp & 0x7f); 
     } while ((tmp & 0x80) != 0); 
     do 
     { 
      tmp = datas[offset++]; 
      height = (height << 7) | (tmp & 0x7f); 
     } while ((tmp & 0x80) != 0); 

     var bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed); 
     BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), 
            ImageLockMode.WriteOnly, bmp.PixelFormat); 
     int stride = (width + 7) >> 3; 
     var tmpdata = new byte[height * width]; 
     for (int i = 0; i < height; i++) 
     { 
      int pos = stride * i; 
      byte mask = 0x80; 
      for (int j = 0; j < width; j++) 
      { 
       if ((datas[offset + pos] & mask) == 0) 
        tmpdata[i * width + j] = 0; 
       else 
        tmpdata[i * width + j] = 0xff; 
       mask >>= 1; 
       if (mask == 0) 
       { 
        mask = 0x80; 
        pos++; 
       } 
      } 
     } 
     Marshal.Copy(tmpdata, 0, bd.Scan0, tmpdata.Length); 

     bmp.UnlockBits(bd); 
     bmp.Save(outputFile, format); 
    } 
} 
+0

Ciao, il codice sta dando errori, pubblica la tua classe completa incluse le istruzioni "Using.System" ecc. Supponiamo che il file sia chiamato test.wbmp e che la sua posizione sia Desktop. –

+0

@AmberArroway: aggiornato – Ria

+0

dai un'occhiata alla domanda modificata –