我想创建一个Web应用程序,允许用户将自己的图片上传到服务器。 当他们点击发送,他们的形象将被上传到服务器(多)。 保存前,我想和图像操作一些,所以我决定用..
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(高×宽),其结果总是已旋转的图像(2448 X 3264)。
请问有什么解决方案来解决这个问题呢?
这是一个错误或任何定义的API规范?
谢谢。
PS。 对不起,我的英语:d
如果它被采取与移动设备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旋转图像的类)。
颇为有趣的问题......你可以尝试通过对图像的宽度和高度引入检查,分别比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);
}