日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java图片上传被旋转,在其他大牛那看到的java手机图片上传旋转问题的解决方法...

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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手机图片上传旋转问题的解决方法...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。