java旋轉圖片

    /**
     * 旋轉角度
     * @param src 源圖片
     * @param angel 角度
     * @return 目標圖片
     */
    public static BufferedImage rotate(Image src, int angel) {
        int src_width = src.getWidth(null);
        int src_height = src.getHeight(null);
        // calculate the new image size
        Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(
                src_width, src_height)), angel);

        BufferedImage res = null;
        res = new BufferedImage(rect_des.width, rect_des.height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = res.createGraphics();
        // transform(這裏先平移、再旋轉比較方便處理;繪圖時會採用這些變化,繪圖默認從畫布的左上頂點開始繪畫,源圖片的左上頂點與畫布左上頂點對齊,而後開始繪畫,修改座標原點後,繪畫對應的畫布起始點改變,起到平移的效果;而後旋轉圖片便可)
     //平移(原理修改座標系原點,繪圖起點變了,起到了平移的效果,若是做用於旋轉,則爲旋轉中心點) g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2);

     //旋轉(原理transalte(dx,dy)->rotate(radians)->transalte(-dx,-dy);修改座標系原點後,旋轉90度,而後再還原座標系原點爲(0,0),可是整個座標系已經旋轉了相應的度數 ) g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);
// //先旋轉(以目標區域中心點爲旋轉中心點,源圖片左上頂點對準目標區域中心點,而後旋轉) // g2.translate(rect_des.width/2,rect_des.height/ 2); // g2.rotate(Math.toRadians(angel)); // //再平移(原點恢復到源圖的左上頂點處(如今的右上頂點處),不然只能畫出1/4) // g2.translate(-src_width/2,-src_height/2);
g2.drawImage(src, null, null); return res; } /** * 計算轉換後目標矩形的寬高 * @param src 源矩形 * @param angel 角度 * @return 目標矩形 */ private static Rectangle CalcRotatedSize(Rectangle src, int angel) { double cos = Math.abs(Math.cos(Math.toRadians(angel))); double sin = Math.abs(Math.sin(Math.toRadians(angel))); int des_width = (int)(src.width * cos) + (int)(src.height * sin); int des_height = (int)(src.height * cos) + (int)(src.width * sin); return new java.awt.Rectangle(new Dimension(des_width, des_height)); }

1.先平移再旋轉java

 

2.先旋轉,再平移spa

相關文章
相關標籤/搜索