2009-03-23 10 views
6

में एक प्रारूप 24bppRgb से स्वरूप स्वरूप में एक प्रारूप 8bppIndexed में कनवर्ट करना ठीक है, मेरे पास 8-बिट अनुक्रमित प्रारूप में बाहरी एप्लिकेशन से एक छवि आ रही है। मुझे इस छवि को सटीक आकार के 24-बिट प्रारूप में परिवर्तित करने की आवश्यकता है।सी #/जीडीआई +

मैंने एक ही आकार का एक नया बिटमैप बनाने और प्रारूप 24bppRgb टाइप करने और फिर एक ग्राफिक्स ऑब्जेक्ट का उपयोग करके इसे एक बीएमपी के रूप में सहेजने से पहले 8-बिट छवि खींचने का प्रयास किया है। यह दृष्टिकोण त्रुटि नहीं करता है, लेकिन जब मैं परिणामस्वरूप छवि खोलता हूं तो बीएमपी हेडर में सभी प्रकार के फंकी मूल्य होते हैं। ऊंचाई और चौड़ाई बड़ी है और इसके अलावा, संपीड़न झंडे और कुछ अन्य के लिए मजाकिया (और बड़े) मान हैं। दुर्भाग्यवश मेरी विशेष आवश्यकताएं इस फ़ाइल को एक विशिष्ट प्रिंटर ड्राइवर को पास करने के लिए हैं जो 24-बिट छवि को विशिष्ट हेडर मानों (जिसे मैं जीडीआई + के माध्यम से प्राप्त करने की कोशिश कर रहा हूं)

किसी को भी "अप- एक अनुक्रमित फ़ाइल को एक अनुक्रमित 24-बिट फ़ाइल में परिवर्तित करना? यदि कोई उदाहरण नहीं है, तो मुझे अपना रास्ता लिखने के लिए किस पथ को शुरू करना चाहिए?

-Kevin Grossnicklaus [email protected]

उत्तर

0

यह अजीब लगता है कि आप एक ही चौड़ाई और अपने इनपुट के रूप में ऊंचाई का एक बिटमैप बना रहे हैं, फिर भी उत्पन्न बीएमपी बहुत बड़ा है। क्या आप कुछ कोड पोस्ट कर सकते हैं?

0

समस्या शायद आपकी स्रोत छवि और आपकी आउटपुट छवि के लंबवत- और क्षैतिज पुनरुत्थान के बीच का अंतर है। यदि आप 72 डीपीआई के संकल्प के साथ एक 8 बीपीपी अनुक्रमित बिटमैप लोड करते हैं, और उसके बाद एक नया 24 बीपीपी बिटमैप बनाएं (डिफ़ॉल्ट रिज़ॉल्यूशन 96 डीपीआई होगा ... कम से कम यह मेरे सिस्टम पर है) और उसके बाद ग्राफिक्स का उपयोग करें। ड्राइमेज को नए पर ब्लाइट करने के लिए बिटमैप, आपकी छवि थोड़ा ज़ूम इन और फसल दिखाई देगी।

यह कहकर, मुझे अपने सिर के शीर्ष से पता नहीं है कि ठीक से आउटपुट बिटमैप और/या ग्राफ़िक्स ऑब्जेक्ट को सहेजे जाने पर ठीक से स्केल करने के लिए बनाएं। मुझे संदेह है कि इसमें पिक्सल की बजाय इंच जैसे सामान्य पैमाने का उपयोग करके छवियों को बनाने के साथ कुछ करना होगा।

11

मैंने 8bpp से 24bpp तक एक छवि को "अप-कन्वर्ट" करने के लिए नीचे दिए गए कोड का उपयोग किया। एक हेक्स संपादक के साथ जेनरेट की गई 24bpp फ़ाइल का निरीक्षण करना और 8bpp फ़ाइल के विरुद्ध तुलना करना दो फ़ाइलों में ऊंचाई और चौड़ाई में कोई अंतर नहीं दिखाता है। यही है, 8 बीपीपी छवि 1600x1200 थी, और 24 बीपीपी छवि के समान मूल्य हैं।

private static void ConvertTo24(string inputFileName, string outputFileName) 
    { 
     Bitmap bmpIn = (Bitmap)Bitmap.FromFile(inputFileName); 

     Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb); 
     using (Graphics g = Graphics.FromImage(converted)) 
     { 
      // Prevent DPI conversion 
      g.PageUnit = GraphicsUnit.Pixel 
      // Draw the image 
      g.DrawImageUnscaled(bmpIn, 0, 0); 
     } 
     converted.Save(outputFileName, ImageFormat.Bmp); 
    } 

हेडर में बाकी सब कुछ उचित दिखता है, और छवियां मेरे सिस्टम पर समान दिखाई देती हैं। आप क्या देख रहे हैं "फंकी मूल्य"?

+1

आप g.PageUnit = GraphicsUnit.Pixel शामिल करने के लिए सुनिश्चित करने के लिए कि यह डीपीआई रूपांतरण (DrawImage डिफ़ॉल्ट रूप से करता है) कर के बजाय पिक्सेल के लिए पिक्सेल ड्रॉ कर सकते हैं। –

+0

@ क्रिस: टिप के लिए धन्यवाद। मैं इसे जोड़ दूंगा। –

+0

@ जिम: मैं यह सुनिश्चित करना चाहता हूं कि परिणाम वास्तव में अपरिवर्तित है (मैंने आज ऐसा मामला मारा है) को संकल्प सेट करने के लिए उस एरलैंडो के सुझाव को जोड़ना चाहते हैं। –

4

यह मेरा रूपांतरण कोड है। स्रोत छवि और परिणामी छवि के बीच संकल्प के मिलान पर ध्यान दें।

private void ConvertTo24bppPNG(Stream imageDataAsStream, out byte[] data) 
    { 
     using (Image img = Image.FromStream(imageDataAsStream)) 
     { 
      using (Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb)) 
      { 
       // ensure resulting image has same resolution as source image 
       // otherwise resulting image will appear scaled 
       bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution); 

       using (Graphics gfx = Graphics.FromImage(bmp)) 
       { 
        gfx.DrawImage(img, 0, 0); 
       } 

       using (MemoryStream ms = new MemoryStream()) 
       { 
        bmp.Save(ms, ImageFormat.Png); 
        data = new byte[ms.Length]; 
        ms.Position = 0; 
        ms.Read(data, 0, (int) ms.Length); 
       } 
      } 
     } 
    } 
संबंधित मुद्दे