2012-08-13 13 views
5

Google पर इस बारे में अधिक समय शोध करने के बाद, मैं एक Wbmp छवि को C# में पीएनजी प्रारूप में परिवर्तित करने के उदाहरण में नहीं आया, मैंने इंटरनेट से कुछ Wbmp छवियां डाउनलोड की हैं और मैं उन्हें एक बाइनरी संपादक का उपयोग कर देख रहा हूं।Wbmp से Png को परिवर्तित करने के लिए कैसे?

क्या किसी के पास एल्गोरिदम है जो ऐसा करने में मेरी सहायता करेगा या कोई भी कोड भी मदद करेगा।

चीजें मैं अब तक पता:

  1. पहले बाइट (मोनोक्रोम छवियों के लिए 0) प्रकार * है
  2. दूसरा बाइट एक "निश्चित-हैडर" कहा जाता है और 0
  3. तीसरा बाइट है पिक्सेल में छवि की चौड़ाई है *
  4. चौथा बाइट चित्रों की ऊंचाई पिक्सल में है *
  5. पंक्तियों में व्यवस्थित डेटा बाइट्स - प्रति बिट एक पिक्सेल: कहाँ पंक्ति लंबाई 8 से विभाज्य नहीं है, पंक्ति बाइट सीमा

मैं पूरी तरह से खो रहा हूँ ताकि किसी भी मदद की सराहना की होगी को 0-गद्देदार है


अन्य कोड से कुछ :

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); 
     } 
     } 
    } 
} 

और

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 

प्रक्रिया:

  1. Wbmp पर शोध किया

  2. पहले विवरण की जाँच करने के लिए X.wbmp खोलें

  3. व्यायाम करें कि कैसे आप चौड़ाई और WBMP फ़ाइल की ऊंचाई को खोजने (ताकि आप बाद में कोड लिख सकते हैं)। ध्यान दें कि लम्बाई बाइट्स (एक बार एमएसबी को मंजूरी मिलने के बाद) को परिवर्तित करने का सबसे आसान तरीका इकाई को बेस-128 के रूप में मानना ​​है।

  4. अपडेट किए गए नमूना कोड को देखें।

  5. मैं कोशिश करते हैं और बिटमैप वस्तु पर एक SetPixel करना होगा एक खाली बिटमैप वस्तु बना सकते हैं और क्या हम (3)

  6. में बाहर काम किया डेटा के हर बिट के लिए करने के लिए अपनी चौड़ाई और ऊंचाई निर्धारित करने की कोशिश कर रहा हूँ, बनाया था।

  7. गद्देदार 0s जब WBMP चौड़ाई सहेजें() विधि का उपयोग कर 8.

  8. सहेजें बिटमैप की एक बहु नहीं है।

आवेदन का उदाहरण उपयोग। यह माना जाता है कि एप्लिकेशन को Wbmp2Png कहा जाता है।

Wbmp2Png IMG_0001.wbmp IMG_0002.wbmp IMG_0003.wbmp 

आवेदन IMG_0001.wbmp, IMG_0002 से प्रत्येक धर्मान्तरित: कमांड लाइन में।wbmp, और IMG_0003.wbmp पीएनजी फ़ाइलों में।

उत्तर

3

ऐसा लगता है कि यह काम पूरा हो गया है।

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

इस कोड को आजमाएं, यह काम करता है!

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

हाय, कोड त्रुटियां दे रहा है, "पूर्ण सिस्टम" आदि विवरण सहित अपनी पूरी कक्षा पोस्ट करें। मान लें कि फ़ाइल test.wbmp कहलाती है और इसका स्थान डेस्कटॉप है। –

+0

@AmberArroway: – Ria

+0

अपडेट किया गया संपादित प्रश्न पर एक नज़र डालें –

संबंधित मुद्दे