package org.ripple.power.ui.projector.action.sprite; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import org.ripple.power.utils.GraphicsUtils; public class SpriteRotate { private int oldAngle, newAngle; private BufferedImage bufferImage, showImage; public boolean updateImage; private int width, height; public SpriteRotate(SpriteImage img, int w, int h, float angle) { set(img.getImage(), w, h, angle); } public SpriteRotate(String fileName, float angle) { BufferedImage image = GraphicsUtils.loadBufferedImage(fileName); set(image, image.getWidth(null), image.getHeight(null), angle); } public SpriteRotate(BufferedImage image, int w, int h, float angle) { set(image, image.getWidth(), image.getHeight(), angle); } public void set(BufferedImage image, int w, int h, float angle) { if (angle > 360 || angle < -360) { angle = 0; } this.width = w; this.height = h; this.updateImage = true; this.bufferImage = image; this.showImage = null; this.newAngle = (int) angle; } public BufferedImage finalBitmap() { return bufferImage; } /** * 由于Android版本下像素操作效率实在太低,为两版兼顾,JavaSE版本暂时设定为创建新图进行旋转。 * (PS:关键问题是,Android环境不支持直接修改显存中像素点,否则此部分将像素旋转适当角度的cos 与sin效率将在直接旋转图片之上。) * * @return */ public BufferedImage getBitmap(final int type) { if (updateImage) { if (oldAngle != newAngle) { oldAngle = newAngle; BufferedImage tmp = showImage; set(bufferImage, bufferImage.getWidth(), bufferImage.getHeight(), newAngle); if (type == 0 || type == 3) { showImage = GraphicsUtils.rotateImageRect(bufferImage, newAngle); } else { showImage = GraphicsUtils .rotateImage(bufferImage, newAngle); } if (tmp != null) { tmp.flush(); tmp = null; } return showImage; } else { if (showImage == null) { return bufferImage; } else { return showImage; } } } return bufferImage; } public void setAngle(float angle) { if (angle > 360) { angle = 360; } else if (angle < -360) { angle = -360; } this.newAngle = (int) angle; } public float getAngle() { return this.newAngle; } public int[] makeSpritePixels() { int angle = (int) newAngle; AffineTransform t = new AffineTransform(); int width = bufferImage.getWidth(); int height = bufferImage.getHeight(); int dW = width; int dH = height; switch (angle) { case 90: { t.translate(height, 0); t.rotate(Math.PI / 2); dW = height; dH = width; break; } case 180: { t.translate(width, height); t.rotate(Math.PI); break; } case 270: { t.translate(0, width); t.rotate(Math.PI * 3 / 2); dW = height; dH = width; break; } case -360: { t.translate(width, 0); t.scale(-1, 1); break; } case -90: { t.translate(height, 0); t.rotate(Math.PI / 2); t.translate(width, 0); t.scale(-1, 1); dW = height; dH = width; break; } case -180: { t.translate(width, 0); t.scale(-1, 1); t.translate(width, height); t.rotate(Math.PI); break; } case -270: { t.rotate(Math.PI * 3 / 2); t.scale(-1, 1); dW = height; dH = width; break; } } BufferedImage img = new BufferedImage(dW, dH, BufferedImage.TYPE_INT_ARGB); Graphics2D g = img.createGraphics(); g.setTransform(t); g.drawImage(bufferImage, (dW - width) / 2, (dH - height) / 2, null); g.dispose(); this.width = dW; this.height = dH; return GraphicsUtils.getPixels(img); } public int[] makePixels() { BufferedImage bitmap = getBitmap(0); this.width = bitmap.getWidth(); this.height = bitmap.getHeight(); return GraphicsUtils.getPixels(bitmap); } public int getHeight() { return height; } public int getWidth() { return width; } }