2013-04-12 20 views
9

Kullanıcıların kendi görüntülerini sunucuya yüklemelerine izin veren bir web uygulaması oluşturmak istiyorum. Gönder'i tıkladıklarında, görüntüleri sunucuya yüklenir (multipart). Kod kaydetmeden önce ben görüntü ile işlem yapmak isteyen, bu yüzden kullanmaya karar ..ImageIO.read() her zaman yüklenen fotoğrafımı döndürüyor

ImageIO.read (inputStream)

BufferedImage nesnesi burada

elde etmektir : ı 3264 x 2448 gibi (yükseklik x genişlik) genişliğinden daha fazla bir yüksekliğe sahip bir resim yüklemek için çalışırken

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; 
} 

sorundur sonuç her zaman döndürülen bir görüntü (2448 x 3264).

Bu sorunu çözmek için herhangi bir çözüm var mı?

Bu bir hata mı yoksa tanımlanmış bir API belirtimi mi?

Thx.

PS. ingilizcem için özür: D

+0

Şimdi benzer bir soru buldum, http://stackoverflow.com/questions/9453367/is-javax-imageio-imageio-broken-it-imports-some-images-as-rotated?rq=1. Yani, benim sorunum ImageIO'nun bir hatası değil ama ImageIO'nun görüntü detayını (EXIF-oryantasyonu) okuyamadığı API spesifikasyonu. TEŞEKKÜRLER. –

cevap

0

Oldukça ilginç bir konu ... sırasıyla 2448 ve 3264 daha büyük olacak şekilde görüntü genişliği ve yüksekliği bir kontrol getirerek bunu düzeltmek için denemek ve sonra sadece

genişliğini ve yüksekliğini takas olabilir kod parçası aşağıda

kullanımı: bu mobil cihaz ile alınmıştır eğer

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. Katılmak için ama benim kelime ve gramerimin yanlış anlamaları sağladığını düşünüyorum. Şimdi sorumu geliştirdim. –

+1

tamam ... şimdi açık ... o SO cevabı var ve sen de buldun :) –

5

ImageIO.read() görüntünün yönünü okuyamaz.

Ben, ben bunun iyi bir çözüm olduğunu düşünüyorum meta okumak için meta-çıkarıcı kullandı: github.com/drewnoakes/metadata-extractor/wiki

<dependency> 
    <groupId>com.drewnoakes</groupId> 
    <artifactId>metadata-extractor</artifactId> 
    <version>2.7.2</version> 
</dependency> 
exif dizinde dosyalanmış

Oku yönelim :

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; 
} 

(Rotasyon gelen bir sınıf olduğunu org.imgscalr.Scalr çerçevesi ti döndürme görüntüsünü kullanıyorum).

+0

Bu son derece yararlı oldu. Scalr sabitleri ile kod da tam olarak ihtiyacım olan şeydi. – Bill

İlgili konular