2012-03-17 13 views
5

का आकार बदलते समय अच्छी तरह से काम करता है, मैं बस एक जेपीजी फ़ाइल 90 डिग्री से घूमने की कोशिश कर रहा हूं। हालांकि मेरा कोड छवि (BufferedImage) आउटपुट करता है जो पूरी तरह से काला है। (डाउनलोड 3.jpg here)एफ़िनट्रांसफॉर्म के साथ जावा इमेज रोटेशन ब्लैक इमेज आउटपुट करता है, लेकिन

private static BufferedImage transform(BufferedImage originalImage) { 
    BufferedImage newImage = null; 
    AffineTransform tx = new AffineTransform(); 
    tx.rotate(Math.PI/2, originalImage.getWidth()/2, originalImage.getHeight()/2); 

    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC); 
    newImage = op.filter(originalImage, newImage); 

    return newImage; 
} 

public static void main(String[] args) throws Exception { 
    BufferedImage bi = transform(ImageIO.read(new File(
      "3.jpg"))); 
    ImageIO.write(bi, "jpg", new File("out.jpg")); 

} 

यहाँ क्या गलत है:

यहाँ जिस तरह से पुन: पेश करने है?

(अगर मैं एक छवि रीसाइज़र पुस्तकालय के लिए इस काले उत्पादन BufferedImage देते हैं, यह अच्छी तरह से आकार दिया जाता है, मूल छवि अभी भी वहाँ है।)

उत्तर

13

दे इसे बनाने से फिल्टर() विधि में एक नया BufferedImage पासिंग बल्कि अपने अपने काम (पूरी तरह से काला नहीं)।

इसके अलावा परिवर्तन सही ढंग से काम नहीं कर रहा था, छवि गंतव्य में ऑफसेट होने के समाप्त हो गई। मैं आवश्यक अनुवादों को मैन्युअल रूप से लागू करके इसे ठीक करने में सक्षम था, इन कार्यों को रिवर्स ऑर्डर में नोट करें, और गंतव्य छवि में चौड़ाई = पुरानी ऊंचाई, और ऊंचाई = पुरानी चौड़ाई।

AffineTransform tx = new AffineTransform(); 

// last, width = height and height = width :) 
tx.translate(originalImage.getHeight()/2,originalImage.getWidth()/2); 
tx.rotate(Math.PI/2); 
// first - center image at the origin so rotate works OK 
tx.translate(-originalImage.getWidth()/2,-originalImage.getHeight()/2); 

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); 

// new destination image where height = width and width = height. 
BufferedImage newImage =new BufferedImage(originalImage.getHeight(), originalImage.getWidth(), originalImage.getType()); 
op.filter(originalImage, newImage); 

फिल्टर के लिए जावाडोक() में कहा गया है कि यह आप के लिए एक BufferedImage पैदा करेगा, मैं अभी भी अनिश्चित क्यों यह काम नहीं करता हूँ, वहाँ एक मुद्दा यहाँ होना चाहिए।

If the destination image is null, a BufferedImage is created with the source ColorModel. 
5

यदि आप एक 3 पार्टी lib (बहुत छोटे, सिर्फ 2 वर्ग) imgscalr एक पंक्ति में आप के लिए ऐसा कर सकते हैं, जबकि सभी फिल्टर gotchas आसपास काम कर रहे प्रयोग का विचार के लिए खुले थे कि अलग छवि प्रकार कर सकते हैं कारण।

Scalr.rotate(...) का उपयोग करते हुए कुछ इस तरह दिखेगा: इस रोटेशन है कि छवियों को संसाधित करता है एक बड़ा एप्लिकेशन का भाग है

BufferedImage newImage = Scalr.rotate(originalImage, Rotation.CW_90); 

हैं, तो आप भी एसिंक्रोनस रूप से यह कर सकते हैं अगर आपको लगता है कि (AsyncScalr class) की जरूरत है।

imgscalr अपाचे 2 लाइसेंस के तहत है और सभी स्रोत उपलब्ध हैं; यदि आप इसे स्वयं हाथ से करना चाहते हैं, तो code for the rotate() method के माध्यम से पढ़ें, मैंने जावा 2 डी में फ़िल्टर के साथ काम करते समय उभरने वाले सभी गॉथ को दस्तावेज किया है।

आशा है कि मदद करता है!

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