java图片上传被旋转,在其他大牛那看到的java手机图片上传旋转问题的解决方法...
// 將圖片文件轉化為字節數組字符串,并對其進行Base64編碼處理
//Base64所用包:org.apache.commons.codec.binary.Base64
public static String encodeImgageToBase64(File imageFile) {
byte[] data = null;
// 讀取圖片字節數組
try {
InputStream in = new FileInputStream(imageFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 對字節數組Base64編碼
return Base64.encodeBase64String(data);// 返回Base64編碼過的字節數組字符串
}
判斷是否旋轉:
/**
*
* @功能:解析base64圖片編碼,判斷是否有旋轉
* @param imgStr base64圖片編碼
* @param format 圖片格式
* @param fileName 圖片名稱
*/
public static Map stringToImage(String imgStr, String format, String fileName){
//解碼base64圖片
byte[] bts = Base64.decodeBase64(imgStr);
InputStream is = new ByteArrayInputStream(bts);
try {
//獲取照片的Exif信息
Metadata metadata = JpegMetadataReader.readMetadata(is);
Directory exif = metadata.getFirstDirectoryOfType(ExifDirectoryBase.class);
/*
//輸出從圖片獲取到的相關信息
Iterable ites = metadata.getDirectories();
for (Directory directory : ites) {
Iterator tags = directory.getTags().iterator();
while(tags.hasNext()){
Tag tag = (Tag) tags.next();
System.out.println(tag);
}
}
*/
//獲取照片拍攝方向
String type = exif.getString(ExifDirectoryBase.TAG_ORIENTATION);
//圖片正常情況下,type=1,測試正常圖片旋轉,請修改case 條件為 1
if(StringUtil.notBlank(type)){//判斷拍攝方向是否為空
switch (Integer.parseInt(type)) {
case 3://要進行180度旋轉
byte[] bytes = rotateImg(bts , 180.0 , format);
return uploadToAliYunOSS(fileName, bytes);
case 6://要進行90度旋轉
byte[] bytes1 = rotateImg(bts , 90.0 , format);
return uploadToAliYunOSS(fileName, bytes1);
case 8://要進行-90度旋轉
byte[] bytes2 = rotateImg(bts , -90.0 , format);
return uploadToAliYunOSS(fileName, bytes2);
default :
return uploadToAliYunOSSBybase64(fileName, bts);
}
}else{
return uploadToAliYunOSSBybase64(fileName, bts);
}
} catch (Exception e) {
e.printStackTrace();
}
return Tool.getError(1, "請求錯誤!", "");
}
矯正圖片旋轉
/**
*
* @功能:矯正圖片旋轉,返回byte[]
* @param input
* @param angle
* @param format
* @param fileName
* @throws IOException void
*/
public static byte[] rotateImg(byte[] bytes , double angle , String format) throws IOException{
InputStream input = new ByteArrayInputStream(bytes);
BufferedImage old_img = ImageIO.read(input);
int width = old_img.getWidth();
int height = old_img.getHeight();
double[][] newPositions = new double[4][];
newPositions[0] = calculatePosition(0, 0, angle);
newPositions[1] = calculatePosition(width, 0, angle);
newPositions[2] = calculatePosition(0, height, angle);
newPositions[3] = calculatePosition(width, height, angle);
double minX = Math.min(
Math.min(newPositions[0][0], newPositions[1][0]),
Math.min(newPositions[2][0], newPositions[3][0])
);
double maxX = Math.max(
Math.max(newPositions[0][0], newPositions[1][0]),
Math.max(newPositions[2][0], newPositions[3][0])
);
double minY = Math.min(
Math.min(newPositions[0][1], newPositions[1][1]),
Math.min(newPositions[2][1], newPositions[3][1])
);
double maxY = Math.max(
Math.max(newPositions[0][1], newPositions[1][1]),
Math.max(newPositions[2][1], newPositions[3][1])
);
int newWidth = (int)Math.round(maxX - minX);
int newHeight = (int)Math.round(maxY - minY);
BufferedImage new_img = new BufferedImageBuilder(newWidth, newHeight , BufferedImage.TYPE_INT_BGR).build();
Graphics2D g = new_img.createGraphics();
g.setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR
);
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON
);
double w = newWidth / 2.0;
double h = newHeight / 2.0;
g.rotate(Math.toRadians(angle), w, h);
int centerX = (int)Math.round((newWidth - width) / 2.0);
int centerY = (int)Math.round((newHeight - height) / 2.0);
g.drawImage(old_img, centerX, centerY, null);
g.dispose();
//新建流。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//利用ImageIO類的write方法,將BufferedImage以png圖片的數據模式寫入流。
ImageIO.write(new_img, format, baos);
return baos.toByteArray();
}
rotateImg() 中的calculatePosition()方法
private static double[] calculatePosition(double x, double y, double angle){
angle = Math.toRadians(angle);
double nx = (Math.cos(angle) * x) - (Math.sin(angle) * y);
double ny = (Math.sin(angle) * x) + (Math.cos(angle) * y);
return new double[] {nx, ny};
}
本文中的方法出處:http://my.oschina.net/u/2344340/blog/699435
總結
以上是生活随笔為你收集整理的java图片上传被旋转,在其他大牛那看到的java手机图片上传旋转问题的解决方法...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡分期能分多少期 灵活选择分期帮你减
- 下一篇: layui 流加载flow遇到的问题