收藏一個圖片任意角度旋轉的函數 很簡練
/**<br />*@param imgSource 源映像<br />*@param cx 旋轉點相對於源映像坐上角橫座標<br />*@param cy 旋轉點相對於源映像坐上角縱座標<br />*@param theta 映像逆時針旋轉的角度<br />*@return 旋轉後的映像<br />*/<br />public Image rotate(Image imgSource, int cx, int cy, double theta)<br />{<br />if (Math.abs(theta % 360) < 1)<br />return imgSource; //角度很小時直接返回</p><p>int w1 = imgSource.getWidth(); //原始映像的高度和寬度</p><p>int h1 = imgSource.getHeight();</p><p>int[] srcMap = new int[w1 * h1];</p><p>imgSource.getRGB(srcMap, 0, w1, 0, 0, w1, h1); //擷取原始映像的像素資訊</p><p>int dx = cx > w1 / 2 ? cx : w1 - cx; //計算旋轉半徑</p><p>int dy = cy > h1 / 2 ? cy : h1 - cy;</p><p>double dr = Math.sqrt(dx * dx + dy * dy);</p><p>int wh2 = (int) (2 * dr + 1); //旋轉後新映像為正方形,其邊長+1是為了防止數組越界</p><p>int[] destMap = new int[wh2 * wh2]; //存放新映像象素的數組</p><p>double destX, destY;</p><p>double radian = theta * Math.PI / 180; //計算角度計算對應的弧度值</p><p>for (int i = 0; i < w1; i++) {<br />for (int j = 0; j < h1; j++) {<br />if (srcMap[j * w1 + i] >> 24 != 0) { //對非透明點才進行處理<br />// 得到當前點經旋轉後相對於新映像左上方的座標<br />destX = dr + (i - cx) * Math.cos(radian) + (j - cy) // 這個地方不懂<br />* Math.sin(radian);<br />destY = dr + (j - cy) * Math.cos(radian) - (i - cx) //這個地方不懂<br />* Math.sin(radian);<br />//從源映像中往新映像中填充像素<br />destMap[(int) destY * wh2 + (int) destX] = srcMap[j * w1<br />+ i];// 不懂<br />}<br />}<br />}<br />return Image.createRGBImage(destMap, wh2, wh2, true); //返迴旋轉後的映像<br />}
還有點缺陷 就是旋轉後的圖片有點失真 函數中標出了不懂的地方 希望高人再指點一下