2013-04-12 3 views
9

Я хочу создать веб-приложение, которое позволит пользователям загружать свое изображение на сервер. Когда они нажмут «Отправить», их изображение будет загружено на сервер (multipart). Перед сохранением, я хочу, чтобы сделать какую-то операцию с изображением, поэтому я решил использовать ..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 х 2448 (высота х ширина), то результатом всегда является изображение, которое было повернуто (2448 x 3264).

Есть ли решение проблемы?

Является ли это ошибкой или какой-либо определенной спецификацией API?

Thx.

PS. извините за мой английский: D

+0

Я нашел аналогичный вопрос сейчас, http://stackoverflow.com/questions/9453367/is-javax-imageio-imageio-broken-it-imports-some-images-as-rotated?rq=1. Таким образом, моя проблема не в том, что ошибка ImageIO, но это спецификация API, что 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

ok ... теперь его ясный ... gud, что у 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 Я использую ti rotate image).

+0

Это было очень полезно. Код с константами Скальра также был тем, что мне нужно. – Bill

Смежные вопросы