2012-06-16 12 views
8

मैं ImageConverter क्लास को देख रहा था, यह पता लगाने की कोशिश कर रहा था कि BufferedImage को 8-बिट रंग में कैसे परिवर्तित किया जाए, लेकिन मुझे नहीं पता कि मैं यह कैसे करूं। मैं इंटरनेट के चारों ओर भी खोज रहा था और मुझे कोई आसान जवाब नहीं मिला, वे सभी 8 बिट ग्रेस्केल छवियों के बारे में बात कर रहे थे। मैं बस एक छवि के रंगों को 8 बिट में परिवर्तित करना चाहता हूं ... और कुछ नहीं, कोई आकार बदलने का कोई मतलब नहीं है। क्या कोई मुझे यह बताता है कि यह कैसे करना है।BufferedImage को 8 बिट में कैसे परिवर्तित करें?

+0

आप शायद एक परिमाणीकरण एल्गोरिथ्म चयन करने के लिए, यानी की है। ऐसा कुछ जो आपकी छवियों के रंगों की श्रेणी को 256 एंट्री पैलेट में बदल देता है। – PhiLho

+0

किसी छवि के रंगों को 8-बिट में परिवर्तित करके आपका क्या मतलब है? मुझे लगता है कि आप कलर स्पेस को कम करना चाहते हैं? क्या आप रंग क्वांटिज़ेशन करना चाहते हैं? – Behe

+0

क्या आप मुझे किसी प्रकार की लाइब्रेरी/एपीआई में इंगित कर सकते हैं? मुझे नहीं पता कि आप किस बारे में बात कर रहे हैं। ऐसा लगता है कि मैं अपना खुद का पैलेट बनाने में सक्षम हूं जो संभव होने पर बेहतर होगा। –

उत्तर

2

लेख "Transparent gifs in Java" at G-Man's Uber Software Engineering Blog से यह कोड स्निपेट में अच्छी तरह से काम करता है:

public static void main(String[] args) throws Exception { 
    BufferedImage src = convertRGBAToIndexed(ImageIO.read(new File("/src.jpg"))); 
    ImageIO.write(src, "gif", new File("/dest.gif")); 
} 

public static BufferedImage convertRGBAToIndexed(BufferedImage src) { 
    BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED); 
    Graphics g = dest.getGraphics(); 
    g.setColor(new Color(231, 20, 189)); 

    // fill with a hideous color and make it transparent 
    g.fillRect(0, 0, dest.getWidth(), dest.getHeight()); 
    dest = makeTransparent(dest, 0, 0); 

    dest.createGraphics().drawImage(src, 0, 0, null); 
    return dest; 
} 

public static BufferedImage makeTransparent(BufferedImage image, int x, int y) { 
    ColorModel cm = image.getColorModel(); 
    if (!(cm instanceof IndexColorModel)) 
     return image; // sorry... 
    IndexColorModel icm = (IndexColorModel) cm; 
    WritableRaster raster = image.getRaster(); 
    int pixel = raster.getSample(x, y, 0); // pixel is offset in ICM's palette 
    int size = icm.getMapSize(); 
    byte[] reds = new byte[size]; 
    byte[] greens = new byte[size]; 
    byte[] blues = new byte[size]; 
    icm.getReds(reds); 
    icm.getGreens(greens); 
    icm.getBlues(blues); 
    IndexColorModel icm2 = new IndexColorModel(8, size, reds, greens, blues, pixel); 
    return new BufferedImage(icm2, raster, image.isAlphaPremultiplied(), null); 
} 
+0

बहुत अच्छा काम किया, बस पारदर्शिता भाग को हटाना पड़ा। –

1

आप ConvertUtil कक्षा में convert8 विधि का उपयोग कर सकते हैं।

विवरण के लिए here देखें।

+0

मैं ConvertUtil.convert8 का उपयोग नहीं कर सका, इसलिए मुझे उस वर्ग को आयात करना होगा, लेकिन मुझे नहीं मिला कि आयात कोड क्या था। क्या आप मौके से क्या करते हैं/कहां है? – Dak31

4

आप जेए (जावा उन्नत इमेजिंग), आधिकारिक सूर्य (अब ओरेकल) छवि लाइब्रेरी का उपयोग करने के लिए इसका उपयोग कर सकते हैं।

ColorQuantizerDescriptor आपके द्वारा लागू किए जा सकने वाले क्वांटिज़ेशन प्रक्रियाओं की पसंद दिखाता है।

+0

क्या आपके पास कुछ नमूना कोड है? http://stackoverflow.com/questions/15312921/how-to-use-colorquantizerdescriptor –

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