2013-04-12 18 views
9

घुमाता है मैं एक वेब एप्लिकेशन बनाना चाहता हूं जो उपयोगकर्ताओं को सर्वर पर अपनी छवि अपलोड करने की अनुमति दे। जब वे भेजें क्लिक करते हैं, तो उनकी छवि सर्वर (मल्टीपार्ट) पर अपलोड की जाएगी। सहेजने से पहले, मैं छवि के साथ कुछ आपरेशन करना चाहते हैं, तो मैं का उपयोग करने का फैसला किया ..ImageIO.read() हमेशा मेरी अपलोड की गई तस्वीर

ImageIO.read (InputStream)

BufferedImage वस्तु

यहाँ

प्राप्त करने के लिए कोड है :

public static BufferedImage getBufferedImageFromMultipartFile(MultipartFile file) 
throws APIException 
{ 
    BufferedImage bi = null; 

    try 
    { 
     bi = ImageIO.read(file.getInputStream()); 
    } 
    catch (IOException e) 
    { 
     throw new APIException(ErrorCode.SERVER_ERROR, e); 
    } 

    return bi; 
} 

समस्या है जब मैं चौड़ाई की तुलना में अधिक इस तरह के रूप 3264 x 2448 (ऊँचाई x चौड़ाई) ऊंचाई है कि एक तस्वीर अपलोड करने की कोशिश, परिणाम हमेशा एक छवि है जो घुमाया गया है (2448 x 3264)।

क्या इस समस्या को हल करने के लिए कोई समाधान है?

क्या यह एक बग या कोई परिभाषित एपीआई विनिर्देश है?

Thx।

पीएस। के लिए मेरी अंग्रेजी खेद: डी

+0

मुझे अब भी इसी तरह का सवाल मिला है, http://stackoverflow.com/questions/9453367/is-javax-imageio-imageio-broken-it-imports-some-images-as-rotated?rq=1। इसलिए, मेरी समस्या इमेजियो की एक बग नहीं है लेकिन यह एपीआई विनिर्देश है कि ImageIO छवि विवरण (EXIF-अभिविन्यास) नहीं पढ़ सकता है। धन्यवाद। –

उत्तर

0

काफी दिलचस्प मुद्दा ... आप छवि चौड़ाई और ऊंचाई पर एक जाँच शुरू क्रमशः 2448 और 3264 से भी बड़ा करके इसे ठीक करने और फिर बस अपनी चौड़ाई और ऊंचाई

स्वैप कोशिश कर सकते हैं कोड का टुकड़ा नीचे

उपयोग:

BufferedImage oldImage = ImageIO.read(file.getInputStream()); 

if (oldImage.getWidth() > 2448 || oldImage.getHeight() > 3264) { 

    BufferedImage newImage = new BufferedImage(oldImage.getWidth(), 
       oldImage.getHeight(), oldImage.getType()); 

    Graphics2D graphics = (Graphics2D) newImage.getGraphics(); 

    graphics.drawImage(oldImage, 0, 0, oldImage.getHeight(), 
       oldImage.getWidth(), null); 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    ImageIO.write(newImage, "JPG", bos); 
} 
+0

thx। भाग लेने के लिए, लेकिन मुझे लगता है कि मेरा शब्द और व्याकरण आपको गलतफहमी कर रहा है। अब, मैंने अपना प्रश्न सुधार लिया है। –

+1

ठीक है ... अब इसकी स्पष्ट ... गड़बड़ है कि SO का जवाब है और आपको यह भी मिला :) –

5

ImageIO.read() छवि के उन्मुखीकरण को नहीं पढ़ अगर यह मोबाइल डिवाइस के साथ लिया गया था कर सकते हैं।

मैं मेटाडाटा-निकालने के लिए इस्तेमाल किया मेटाडाटा पढ़ने में, मुझे लगता है कि यह एक अच्छा समाधान है: github.com/drewnoakes/metadata-extractor/wiki

<dependency> 
    <groupId>com.drewnoakes</groupId> 
    <artifactId>metadata-extractor</artifactId> 
    <version>2.7.2</version> 
</dependency> 

पढ़ें उन्मुखीकरण exif निर्देशिका में दायर:

ExifIFD0Directory exifIFD0 = metadata.getDirectory(ExifIFD0Directory.class); 
int orientation = exifIFD0.getInt(ExifIFD0Directory.TAG_ORIENTATION); 

switch (orientation) { 
    case 1: // [Exif IFD0] Orientation - Top, left side (Horizontal/normal) 
    return null; 
    case 6: // [Exif IFD0] Orientation - Right side, top (Rotate 90 CW) 
    return Rotation.CW_90; 
    case 3: // [Exif IFD0] Orientation - Bottom, right side (Rotate 180) 
    return Rotation.CW_180; 
    case 8: // [Exif IFD0] Orientation - Left side, bottom (Rotate 270 CW) 
    return Rotation.CW_270; 
} 

(रोटेशन एक वर्ग से है org.imgscalr.Scalr ढांचे मैं टीआई घुमावदार छवि का उपयोग करें)।

+0

यह बेहद सहायक था। स्केलर स्थिरांक के साथ कोड भी वही था जो मुझे चाहिए था। – Bill

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