Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Изменение размера изображения


Автор: BuggyDdd 21.12.2007, 14:13
Скажите пожалуйста, как можно изменить размеры изображения под ширину и высоту экрана? Просто я получаю данные с папки изображения, там картинки большого размера и при выводе их в своей программе они не влезают.

Автор: DEER 21.12.2007, 15:35
держи кусок на эту тему.
думаю разберешься
Код

    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);
    }


Автор: eugine_s 21.12.2007, 16:21
DEER, конфа по J2ME.... идея-то может и пойдет, но реализация - нет.



BuggyDdd, посмотри вот http://www.mgdc.ru/index.php?option=com_content&task=view&id=36&Itemid=35

Автор: DEER 21.12.2007, 17:18
eugine_s, ну это не J2ME, но для мобил вообще то писали... для смартов наверное..
мдя. чото я ошибся раздельчиком

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)