import java.awt.Graphics2D;import java.awt.Image;import java.awt.MediaTracker;import java.awt.geom.AffineTransform;import java.awt.image.AffineTransformOp;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.Iterator;import javax.imageio.IIOImage;import javax.imageio.ImageIO;import javax.imageio.ImageTypeSpecifier;import javax.imageio.ImageWriteParam;import javax.imageio.ImageWriter;import javax.imageio.stream.ImageOutputStream;import javax.swing.JPanel;public class RotateImage extends JPanel {Image image;BufferedImage bufImage; // 用於顯示的緩衝區映像BufferedImage originalBufImage; // 原始緩衝區映像Graphics2D bufImageG; // 緩衝區映像的圖形環境public void loadImage(String fileName) {image = this.getToolkit().getImage(fileName); // 取得映像MediaTracker mt = new MediaTracker(this); // 執行個體化媒體載入器mt.addImage(image, 0); // 增加映像到載入器中try {mt.waitForAll(); // 等待圖片載入} catch (Exception ex) {ex.printStackTrace(); // 輸出出錯資訊}originalBufImage = new BufferedImage(image.getWidth(this), image.getHeight(this), BufferedImage.TYPE_INT_ARGB); // 建立原始緩衝區映像bufImage = originalBufImage;bufImageG = bufImage.createGraphics(); // 建立bufImage的圖形環境bufImageG.drawImage(image, 0, 0, this); // 傳輸源映像資料到緩衝區映像中}// 過濾映像public void ratoteImage(int angle) {if (bufImage == null)return; // 如果bufImage為空白則直接返回BufferedImage filteredBufImage = new BufferedImage(image.getWidth(this), image.getHeight(this),BufferedImage.TYPE_INT_RGB); // 過濾後的映像AffineTransform transform = new AffineTransform(); // 仿射變換對象transform.rotate(java.lang.Math.toRadians(angle),image.getWidth(this) / 2, image.getHeight(this) / 2); // 旋轉映像AffineTransformOp imageOp = new AffineTransformOp(transform, null);// 建立仿射變換操作對象imageOp.filter(originalBufImage, filteredBufImage);// 過濾映像,靶心圖表像在filteredBufImagebufImage = filteredBufImage; // 讓用於顯示的緩衝區映像指向過濾後的映像drawImg(bufImage);}public void drawImg(BufferedImage image) {ImageWriter writer = null;ImageTypeSpecifier type = ImageTypeSpecifier.createFromRenderedImage(image);Iterator iter = ImageIO.getImageWriters(type, "jpg");if (iter.hasNext()) {writer = (ImageWriter) iter.next();}if (writer == null) {return;}IIOImage iioImage = new IIOImage(image, null, null);ImageWriteParam param = writer.getDefaultWriteParam();param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);param.setCompressionQuality((float) ((1) / 10.0));ImageOutputStream outputStream;try {outputStream = ImageIO.createImageOutputStream(new File("test.jpg"));writer.setOutput(outputStream);writer.write(null, iioImage, param);} catch (IOException e) {e.printStackTrace();}}/** * @param args */public static void main(String[] args) {RotateImage rotateImg = new RotateImage();rotateImg.loadImage("bm.jpg"); // 裝載圖片rotateImg.ratoteImage(90);}}