держи кусок на эту тему. думаю разберешься
| Код | private static BufferedImage transformImage(BufferedImage srcImg, double srcW, double srcH, double rotate, double winX, double winY, double scaleLevel) { double buf; if (rotate != 0) { buf = srcW; srcW = srcH; srcH = buf;
buf = winX; winX = winY; winY = buf; }
if (scaleLevel == 0d) { //всякартинка должна поместиться на изображении winX = winY = 0; }
//if(ver > XXX) //maxScaleLevel пока равен 3 для всех версий 2<<3=8 winX /= 8d; winY /= 8d;
if (rotate != 0) { //TODO поворот почему--то нельзя совершать на 270 градусов. пока забиваю на это, но оптом нужно разобраться rotate = Math.PI / 2; }
scaleLevel = Math.pow(2d, scaleLevel);
return transformImageInternal(srcImg, srcW, srcH, rotate, winX, winY, scaleLevel); }
/** * @param srcImg * @param srcW - ширина экрана, на котором будет отображаться картинка * @param srcH - высота экрана, на котором будет отображаться картинка * @param rotate - на сколько поворачивать картинку * @param winX - точная координата X верхней точки, которая будет показываться на экране * @param winY - точная координата Y верхней точки, которая будет показываться на экране * @param scaleLevel - (0,1,2,3)коэфициент увеличения размеров. Он испоьльзуется при resize * @return результирующее изображение */ private static BufferedImage transformImageInternal(BufferedImage srcImg, double srcW, double srcH, double rotate, double winX, double winY, double scaleLevel) {
double scaleBase; if ((double) srcImg.getWidth() / (double) srcImg.getHeight() >= srcW / srcH) { //ширина экрана меньше высоты - обычное дело для сотовых телефонов scaleBase = srcW / (double) srcImg.getWidth(); } else { //высота экрана убогая scaleBase = srcH / (double) srcImg.getHeight(); }
double scale = scaleBase * scaleLevel;
int imgX1 = (int) (winX / scaleBase); int imgY1 = (int) (winY / scaleBase); int imgX2 = imgX1 + (int) (srcW / scale); if (imgX2 > srcImg.getWidth()) imgX2 = srcImg.getWidth(); int imgY2 = imgY1 + (int) (srcH / scale); if (imgY2 > srcImg.getHeight()) imgY2 = srcImg.getHeight();
BufferedImage srcImCut; if (imgX2 - imgX1 != srcImg.getWidth() || imgY2 - imgY1 != srcImg.getHeight()) { srcImCut = srcImg.getSubimage(imgX1, imgY1, imgX2 - imgX1, imgY2 - imgY1); } else { srcImCut = srcImg; } System.out.println("Cut (x1,y1,x2,y2)=(" + imgX1 + "," + imgY1 + "," + imgX2 + "," + imgY2 + ")");
AffineTransform at = new AffineTransform();
// scale image at.scale(scale, scale); System.out.println("Scale (w,h)=(" + ((imgX2 - imgX1) * scale) + "," + ((imgY2 - imgY1) * scale) + ")");
if (rotate != 0) { System.out.println("Rotate angel=" + (rotate * 180 / Math.PI)); at.rotate(rotate, srcImCut.getWidth() / 2.0, srcImCut.getHeight() / 2.0); }
AffineTransform translationTransform; translationTransform = findTranslation(at, srcImCut); at.preConcatenate(translationTransform);
BufferedImageOp bio; bio = new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
return bio.filter(srcImCut, null); }
|
|