2013-04-12 13 views
9

Chcę utworzyć aplikację internetową, która pozwoli użytkownikom przesłać swój obraz na serwer. Kiedy klikną Wyślij, ich obraz zostanie przesłany na serwer (wieloczęściowy). Przed zapisaniem, chcę zrobić kilka operacji z obrazem, więc postanowiłem wykorzystać ..ImageIO.read() zawsze obraca moje przesłane zdjęcie

ImageIO.read (InputStream)

dostać BufferedImage obiekt

oto kod :

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

problem jest, gdy próbuję załadować obraz, który ma wysokość większą niż szerokość, takich jak 3264 x 2448 (wysokość x szerokość), przy czym zawsze wyświetlać obraz, który został obrócony (2448 x 3264).

Czy istnieje rozwiązanie tego problemu?

Czy to błąd, czy jakakolwiek zdefiniowana specyfikacja interfejsu API?

Thx.

PS. Przepraszam za mój angielski: D

+0

Znalazłem podobne pytanie już teraz, http://stackoverflow.com/questions/9453367/is-javax-imageio-imageio-broken-it-imports-some-images-as-rotated?rq=1. Tak więc, moim problemem nie jest błąd w ImageIO, ale jest to specyfikacja API, że ImageIO nie może odczytać szczegółów obrazu (orientacja EXIF). DZIĘKI. –

Odpowiedz

0

Dość ciekawy problem ... można spróbować go naprawić poprzez wprowadzenie czek na szerokość i wysokość, aby być większa niż 2448 i 3264 odpowiednio a potem po prostu zamienić swoją szerokość i wysokość

skorzystać z poniższego fragmentu kodu:

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. do udziału, ale myślę, że moje słowo i gramatyka sprawiają, że nieporozumienia. Teraz poprawiłem moje pytanie. –

+1

ok ... teraz jest jasne ... GUD, SO ma odpowiedź i Ty też ją znalazłeś :) –

5

ImageIO.read() nie może odczytać orientacji obrazu, jeśli została ona podjęta z urządzenia mobilnego.

użyłem metadanych-ściągacza do odczytu metadanych, myślę, że to dobre rozwiązanie: github.com/drewnoakes/metadata-extractor/wiki

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

orientacja Czytaj złożone w exif katalogu:

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

(Rotacja jest klasa z org.imgscalr.Scalr framework Używam obrazu ti rotate).

+0

To było bardzo pomocne. Kod ze stałymi Scalr był dokładnie tym, czego potrzebowałem. – Bill

Powiązane problemy