2010-12-08 17 views
40

का उपयोग कर मैं एक jpg फ़ाइल में लिखने के लिए निम्न कोड का उपयोग कर रहा:Ρroblem ImageIO.write jpg फ़ाइल

String url="http://img01.taobaocdn.com/imgextra/i1/449400070/T2hbVwXj0XXXXXXXXX_!!449400070.jpg"; 
String to="D:/temp/result.jpg"; 
ImageIO.write(ImageIO.read(new URL(url)),"jpg", new File(to)); 

लेकिन मैं result.jpg एक गुलाबी पृष्ठभूमि छवि है मिलती है:

alt text

इस समस्या से कैसे निपटा जाए? क्या आप मुझे कुछ उदाहरण कोड दे सकते हैं? (जे 2 एस लाइब्रेरी में)

+0

डुप्लिकेट नहीं बल्कि 'ImageIO.write()': http: // stackoverflow के साथ एक समान परिणाम। कॉम/प्रश्न/1830063/समस्या-कनवर्टिंग-पीएनजी-टू-जेपीजी-उपयोग-जावा-छवि-लेखन –

+0

धन्यवाद, लेकिन 'पृष्ठ नहीं मिला', मुझे जवाब नहीं मिल रहा है – Koerr

+0

आप अंतर्निहित पाठक jpeg पढ़ने के लिए उपयोग करते हैं ImageIO wrapper के साथ? यह छोटी गाड़ी हो सकती है। – Jules

उत्तर

36

आप के बजाय Toolkit.createImage(url) का उपयोग करके इस पर काम कर सकते हैं जो डिकोडिंग एल्गोरिदम के एक अलग कार्यान्वयन का उपयोग करता है।

यदि आप सूर्य जेडीके के साथ जेपीईजी एन्कोडर का उपयोग कर रहे हैं तो आपको यह भी सुनिश्चित करना होगा कि आप इसे अल्फा चैनल के साथ एक छवि पास कर दें।

उदाहरण:

private static final int[] RGB_MASKS = {0xFF0000, 0xFF00, 0xFF}; 
private static final ColorModel RGB_OPAQUE = 
    new DirectColorModel(32, RGB_MASKS[0], RGB_MASKS[1], RGB_MASKS[2]); 

    // ... 

String sUrl="http://img01.taobaocdn.com/imgextra/i1/449400070/T2hbVwXj0XXXXXXXXX_!!449400070.jpg"; 
URL url = new URL(sUrl); 
Image img = Toolkit.getDefaultToolkit().createImage(url); 

PixelGrabber pg = new PixelGrabber(img, 0, 0, -1, -1, true); 
pg.grabPixels(); 
int width = pg.getWidth(), height = pg.getHeight(); 

DataBuffer buffer = new DataBufferInt((int[]) pg.getPixels(), pg.getWidth() * pg.getHeight()); 
WritableRaster raster = Raster.createPackedRaster(buffer, width, height, width, RGB_MASKS, null); 
BufferedImage bi = new BufferedImage(RGB_OPAQUE, raster, false, null); 

String to = "D:/temp/result.jpg"; 
ImageIO.write(bi, "jpg", new File(to)); 

नोट: मेरा अनुमान है कि रंग प्रोफ़ाइल दूषित है है, और Toolkit.createImage() सभी रंग प्रोफाइल पर ध्यान नहीं देता। यदि ऐसा है तो यह जेपीईजी की गुणवत्ता को कम करेगा जिसमें सही रंग प्रोफाइल है।

+0

धन्यवाद, यह वास्तव में काम करता है। –

17

मुझे इसी तरह की समस्याएं थीं। लेकिन तब मैं इसे इस एक

BufferedImage image = new BufferedImage(width, height, 
      BufferedImage.TYPE_INT_RGB); 

    //do something to populate the image 
    //such as 
    image.setRGB(x, y, pixelValue); //set your own pixels color 



    ImageIO.write(image, "jpg", new File("D:\\test.jpg")); 

ध्यान दें कि मैं जावा संस्करण 1.6.0_25-B06 उपयोग कर रहा हूँ का उपयोग करके हल किया और यह सिर्फ ठीक काम करता है है।

शायद आप जावा संस्करण की जांच कर सकते हैं।

+7

कि कुल मिलाकर काम किया! TYPE_INT_RGB यहां महत्वपूर्ण है - यह गुलाबी रंग को हटा देता है - स्रोत एआरजीबी छवि से आउटपुट आरजीबी छवियों में केवल क्लोन पिक्सल और गुलाबी रंग खत्म हो गया है! – gibffe

+0

इस के लिए बहुत ही समान उत्तर (हालांकि इस पर कोड उदाहरण का पालन करना आसान था) http://stackoverflow.com/questions/1830063/problem-converting-png-to-jpg-using-java-imageio-write# उत्तर -8418291 – RedYeti

1
BufferedImage originalImage = ImageIO.read(getContent()); 
BufferedImage newImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR); 

    for (int x = 0; x < originalImage.getWidth(); x++) { 
     for (int y = 0; y < originalImage.getHeight(); y++) { 
      newImage.setRGB(x, y, originalImage.getRGB(x, y)); 
     } 
    } 
इस

मुझे

+0

ने कोशिश की लेकिन मेरे लिए काम नहीं किया –

8

के लिए चाल किया था यह मेरे लिए काम करता है:

int w = originalImage.getWidth(); 
int h = originalImage.getHeight(); 
BufferedImage newImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
int[] rgb = originalImage.getRGB(0, 0, w, h, null, 0, w); 
newImage.setRGB(0, 0, w, h, rgb, 0, w); 
1

मैं जब पढ़ने और ImageIO का उपयोग कर छवियों लिख ही समस्या का सामना करना पड़ा। यहां जवाब पढ़ने के बाद मैंने अपना जेआरई बदल दिया - openjdk version "1.8.0_91" से HotSpot java version "1.8.0_102" पर। संकेत finnw के उत्तर में स्पष्ट नहीं था लेकिन यह एक कोशिश के लायक है ;-)

और इस प्रकार समस्या हल हो गई! तो यदि आप ओपनजेडीके जेआरई का उपयोग कर रहे हैं और अपने जेआरई को बदलने के लिए स्वतंत्र हैं, तो इसे हॉटस्पॉट बदल रहा है और आपको अपना कोड बदलने की आवश्यकता नहीं होगी।

0
  • मेरे लिए समस्या पढ़ने लेकिन लेखन
  • ImageIO खुशी से ARGB BufferedImages से JPG फ़ाइलें लिखने
  • ब्राउज़र्स/अन्य कार्यक्रमों तो CMYK रंग या कुछ और के रूप में यह 4-चैनल फ़ाइल की व्याख्या करेगा नहीं था, जिसके परिणामस्वरूप इस प्रश्न में वर्णित प्रभाव में
  • समाधान मेरे लिए: सुनिश्चित करें कि BufferedImage जो ImageIO को पास किया गया है।लिखने प्रकार आरजीबी (नहीं ARGB) की है
  • यह भी बताता है कि क्यों समस्या केवल प्रकट होता है जब jpeg करने के लिए बचत, लेकिन
  • PNG में बचत नहीं जब मुझे हमेशा क्योंकि मेरी स्वयं की छवि उपकरण यह पता लगाने की के लिए यह काफी समय लगा फ्लाई पर एआरजीबी में कनवर्ट करें, इसलिए मैं हमेशा छवि UIIO.write पर एआरजीबी छवि पास कर रहा था, इसे
संबंधित मुद्दे