2011-08-16 16 views
6

में कनवर्ट करें मेरे पास एक एम्बेडेड सिस्टम के लिए सी भाषा स्रोत कोड है, जिसमें 8-बिट प्रति पिक्सेल ग्रेस्केल छवि के लिए डेटा के सरणी शामिल हैं। मैं सॉफ्टवेयर दस्तावेज करने का प्रभारी हूं और मैं इस स्रोत कोड को जेपीईजी (छवि) फ़ाइल में कनवर्ट करना चाहता हूं।कच्चे ग्रेस्केल बाइनरी को जेपीईजी

यहाँ एक कोड नमूना है:

const unsigned char grayscale_image[] = { 
0, 0, 0, 0, 0, 0, 0, 74, 106, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 
159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 146, 93, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
//... 
}; 
const unsigned int height = 41; 
const unsigned int width = 20; 

यहाँ मेरी सवाल कर रहे हैं: (हाँ, बहुवचन)

  1. क्या आवेदन (रों) आप जेपीईजी करने के लिए इस स्रोत फ़ाइल परिवर्तित करने के लिए सुझाव है?
  2. क्या GIMP या पेंट डेटा की एक CSV फ़ाइल आयात कर सकते हैं?
  3. यदि मैं यह कस्टम एप्लिकेशन लिखता हूं, तो जेपीईजी के लिए जावा पुस्तकालय मौजूद हैं?
  4. इस कार्य को पूरा करने के लिए सी # में कौन सी पुस्तकालय मौजूद हैं? एमएस Visio 2010, Gimp, पेंट, जावा, ग्रहण, एमएस दृश्य स्टूडियो 2010 व्यावसायिक, wxWidgets, wxFrameBuilder, Cygwin:

मैं अपने निपटान में निम्न संसाधनों की है।
मैं सी #, जावा, सी या सी ++ में कस्टम एप्लिकेशन लिख सकता हूं।

आपकी सलाह के लिए धन्यवाद।

+1

इस तरह की छोटी छवि के लिए जेपीईजी की बजाय पीएनजी का उपयोग करने पर विचार करें। –

+1

मैं @ माइकल से सहमत हूं। यह एक लापरवाही प्रारूप फिट बैठता है जैसे पीएनजी जेपीईजी से काफी बेहतर है। छवि छोटी दिखती है और तेज किनारों से है जो इसे जेपीजी से अधिक पीएनजी/जीआईएफ फिट बनाता है। जेपीजी तेज किनारों से अच्छी तरह से सौदा नहीं करता है। – CodesInChaos

उत्तर

1

जावा का उपयोग करने वाला मुद्दा बाइट्स को स्याही के रूप में प्राप्त करना होगा। मूल्यों को ट्रैक करने के लिए आपको पढ़ने के दौरान एक int में कनवर्ट करने की आवश्यकता होगी> 127 क्योंकि जावा में हस्ताक्षरित बाइट्स नहीं हैं।

int height=41; 
int width=20; 
int[] data = {...}; 

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 
for (int x = 0; x < width; x++) { 
    for (int y = 0; y < height; y++) { 
    // fix this based on your rastering order 
    final int c = data[ y * width + x ]; 
    // all of the components set to the same will be gray 
    bi.setRGB(x,y,new Color(c,c,c).getRGB()); 
    } 
} 
File out = new File("image.jpg"); 
ImageIO.write(bi, "jpg", out); 
0

आप जावा में इमेजियो क्लास का उपयोग कर सकते हैं।

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GREY); 

Graphics2D g2 = bi.createGraphics(); 

//loop through and draw the pixels here 

File out = new File("Myimage.jpg"); 
ImageIO.write(bi, "jpg", out); 
+0

क्या यह काम करता है? यह ऊंचाई और चौड़ाई कैसे पता चलेगा? – musefan

+0

@musefan मैंने ग्रेस्केल छवि पढ़ी और माना कि यह मेटाडेटा के साथ एक छवि बाइट सरणी थी। – Andrew

+0

मैंने माना है कि इसमें मेटाडेटा नहीं है क्योंकि इस तथ्य के कारण चौड़ाई और ऊंचाई को अलग से आपूर्ति की गई थी। इसके अलावा, जेपीईजी फ़ाइल प्रारूप 0xFF 0xD8 के साथ शुरू होता है ... शायद ओपी को साफ़ करने के लिए कुछ ऐसा है क्योंकि यह इस पोस्ट के लिए डमी डेटा हो सकता है – musefan

1

मैं जवाब 4 सवाल कर सकते हैं और मैं तुम्हें सी # में यह करने के लिए कोड दे सकते हैं। यह बहुत आसान है ...

int width = 20, height = 41; 
byte[] grayscale_image = {0, 0, 0, ...}; 
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(width, height); 
int x = 0; 
int y = 0; 
foreach (int i in grayscale_image) 
{ 
    bitmap.SetPixel(x, y, System.Drawing.Color.FromArgb(i, i, i)); 
    x++; 
    if (x >= 41) 
    { 
     x = 0; 
     y++; 
    } 
} 
bitmap.Save("output.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 

अगर आपको

संपादित (जैसे बिटमैप स्मृति ताला लगा के रूप में) बिटमैप अनुकूलन तकनीकों के लिए चारों ओर देखने के लिए इस कोड को अनुकूलित करने में सक्षम हो सकता है: बिट के साथ वैकल्पिक लॉकिंग (बहुत तेज होना चाहिए) ...

नोट: बिटमैप ऑब्जेक्ट बनाते समय पिक्सेलफॉर्मैट के बारे में 100% निश्चित नहीं है - उपलब्ध विकल्पों पर मेरा सबसे अच्छा अनुमान था।

int width = 20, height = 41; 
byte[] grayscale_image = {0, 0, 0, ...}; 
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(width, height, PixelFormat.Format8bppIndexed); 

System.Drawing.Imaging.BitmapData bmpData = bitmap.LockBits(
        new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
        ImageLockMode.WriteOnly, bitmap.PixelFormat); 

System.Runtime.InteropServices.Marshal.Copy(bytes, 0, bmpData.Scan0, bytes.Length); 

bitmap.UnlockBits(bmpData); 

return bitmap; 
+0

धन्यवाद। पीसी पर एप्लिकेशन चलाने के लिए कोई प्रदर्शन मानदंड नहीं है। –

+0

क्या यह एक "कंसोल" एप्लिकेशन हो सकता है या क्या इसे जीयूआई की आवश्यकता है? –

+1

@ थॉमस यह एक कंसोल एप्लिकेशन हो सकता है, लेकिन आपको 'System.Drawing.dll' का संदर्भ जोड़ने की आवश्यकता है। – CodesInChaos

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