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


Автор: GhostMasterNet 8.8.2007, 09:35
Вращаю картинку при помощи аффинных преобразований. Но возникает проблема искажения изображения.
При повороте на углы 90, 180, 270, 0 градусов картинка поворачивается нормально, но для других углов происходит визуальное увеличение изображения. В фотошопе такого эффекта не возникает. Может есть какой-нибудь крутой алгоритм или способ?

Автор: SatanClaus 8.8.2007, 15:54
Если ты постепенно поворачиваешь картинку, например на 1 градус, то со временем она исказится...
Чтобы этого не произошло, начальные координаты должны быть константами, а координаты повернутой картинки ты должен каждый раз пересчитывать... Короче все выглядит примерно так:

final int x = 10;
int ugol = 1;

int newX = 0;
....
while (true){
newX = x * matrPovorota(ugol);
}
....
То есть начальные координаты у тебя никогда не изменяются...

Добавлено через 45 секунд
Забыл дописать в цикле: ugol++;

Автор: GhostMasterNet 10.8.2007, 11:39
Ничего нового не сказал. 




Автор: GhostMasterNet 29.8.2007, 16:58
К теме вращения картинок. 

Выкладываю готовый класс, в котором реализованы методы вращения и изменения размеров изображений.

Надеюсь, кому-то это сэкономит время.

Код

/**
 * This class contains methods, what may rotate and scale images.
 * Cos and sin got from Midp 2.0
 * 
 */


public class Translator {

    /**
     * Rotate source image and return rotated.
     * 
     * @param argb_source source image
     * @param argb_rotated rotated image
     * @param alpha angle for rotate
     * @param imageWidth - width of image
     * @param imageHeight - height of image     
     */
    public static void rotateImage(int[] argb_source, int[] argb_rotated, int alpha, int imageWidth, int imageHeight) {

        int x0, y0, x1, y1;
        long sn =(long)( Math.sin( Math.toRadians( alpha ))* 10000); 
        long cs = (long)( Math.cos( Math.toRadians( alpha ))* 10000);
        int xc = imageWidth / 2;
        int yc = imageHeight / 2;

        for (y1 = 0; y1 < imageHeight; y1++) {

            for (x1 = 0; x1 < imageWidth; x1++) {

                // На  всякий случай заполняем  картинку цветом фона
                int bgcol = 0;
                argb_rotated [ y1 * imageWidth + x1 ] = bgcol;
                x0 = ( int ) ( ( cs * ( x1 - xc ) + sn * ( y1 - yc ) ) / 10000 + xc );
                y0 = ( int ) ( - ( sn * ( x1 - xc ) - cs * ( y1 - yc ) ) / 10000 + yc );
                // Проверяем, не  выходит ли точка  за пределы области
                if ( x0 > -1 )
                    if ( x0 < imageWidth)
                        if ( y0 > -1 )
                            if ( y0 < imageHeight ) { // Закрашиваем  точку
                                argb_rotated[ y1 * imageWidth + x1 ] = argb_source[ y0 * imageWidth + x0 ];
                            }

            }

        }
        
    }
    
/**
 * Scale source image. 
 * 
 * Scaled image has same width and height as source, but contents is scaled.
 * If you want grows image, set lambda > 1, else set lambda < 1
 * 
 * @param argb_source - given image for scale
 * @param argb_scaled - result scaled image
 * @param lambda - coefficient of scale
 * @param imageWidth - width of image
 * @param imageHeight - height of image
 */
    public static void scaleImage(int[] argb_source, int[] argb_scaled, double lambda, int imageWidth, int imageHeight) {

        int x0, y0, x1, y1;

        for (y1 = 0; y1 < imageHeight; y1++) {

            for (x1 = 0; x1 < imageWidth; x1++) {

                int bgcol = 0;
                argb_scaled [ y1 * imageWidth + x1 ] = bgcol;
                x0 = ( int ) (x1 / lambda);
                y0 = ( int ) (y1 / lambda);
                
                if ( x0 > -1 )
                    if ( x0 < imageWidth )
                        if ( y0 > -1 )
                            if ( y0 < imageHeight ) { 
                                
                                argb_scaled[ y1 * imageWidth + x1 ] = argb_source[ y0 * imageWidth + x0 ];
                                
                            }
            }

        }
        
    }

    
}


Автор: VKoresh 24.9.2007, 15:08
Вот еще в догонку инфа с Мобилаба - http://www.mobilab.ru/articles/76/
Там же лежат исходники и пример готовой программы.

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