Алгоритмы, методы, исходники / Форум

Алгоритмы, методы, исходники / Форум (http://forum.algolist.ru/)
-   Обработка изображений, звук, графика (http://forum.algolist.ru/algorithm-image-graphics/)
-   -   Поворот изображения (http://forum.algolist.ru/algorithm-image-graphics/3833-povorot-izobrajeniia.html)

гость 21.05.2010 19:25

Поворот изображения
 
Привет всем. Есть картинка размером w на h, храниться она в одномерном чисельном массиве (в формате 0xAARRGGBB). нужно быстро повернуть её на 90 градусов. Вроде ничего сложного, но я почему-то постоянно вылетаю за пределы массива

MBo 21.05.2010 19:46

повернутая картинка должна быть в новом массиве?
Приведите суть проблемного кода, скорее всего, что-то со счетчиками цикла и индексами намудрили

гость 22.05.2010 10:17

Код:

    public void createShiftTable() {
        switch (angle) {
            case NO_ROTATE:
                img_w = (or_img_w * percent) / 100;//ширина картинки
                img_h = (or_img_h * percent) / 100;//высота картинки
                break;
            case ROTATE_90:
                img_w = (or_img_h * percent) / 100;
                img_h = (or_img_w * percent) / 100;
                break;
        }
        dst_img = new int[img_w * img_h];//обработанная картинка
//таблица перехода
        xs_tab = new int[img_w];
        ys_tab = new int[img_h];
        for (int x = 0; x < img_w; x++) {
            xs_tab[x] = (or_img_w * x) / img_w;
        }
        for (int y = 0; y < img_h; y++) {
            ys_tab[y] = (or_img_h * y) / img_h;
        }
        System.gc();
    }
....
                for (int y = 0; y < img_h; y++) {
                    for (int x = 0; x < img_w; x++) {
                        dst_img[y + x * img_w] = src_img[ys_tab[x] + or_img_w * xs_tab[y]];
                    }
                }

Вот, код немножко мутноват

prografix 22.05.2010 10:42

Надо исправить так:
dst_img[y + x * img_h] = ...
Возможно это не единственное место.

гость 22.05.2010 11:17

а... я уже разобрался. Вот я блин ))

гость 22.05.2010 11:19

Код:

    public void createShiftTable() {
        switch (angle) {
            case NO_ROTATE:
                img_w = (or_img_w * percent) / 100;
                img_h = (or_img_h * percent) / 100;
                break;
            case ROTATE_90:
                img_w = (or_img_h * percent) / 100;
                img_h = (or_img_w * percent) / 100;
                break;
        }
        int tmp_img_w = (or_img_w * percent) / 100;
        int tmp_img_h = (or_img_h * percent) / 100;
        dst_img = new int[img_w * img_h];
        xs_tab = new int[tmp_img_w];
        ys_tab = new int[tmp_img_h];
        for (int x = 0; x < tmp_img_w; x++) {
            xs_tab[x] = (or_img_w * x) / tmp_img_w;
        }
        for (int y = 0; y < tmp_img_h; y++) {
            ys_tab[tmp_img_h - y - 1] = or_img_w * ((or_img_h * y) / tmp_img_h);
        }
        System.gc();
    }

    public void Render() {
        int count = 0;
        switch (angle) {
            case NO_ROTATE:
                for (int y = 0; y < img_h; y++) {
                    for (int x = 0; x < img_w; x++) {
                        dst_img[count] = src_img[xs_tab[x] + ys_tab[y]];
                        count++;
                    }
                }
                return;
            case ROTATE_90:
                for (int y = 0; y < img_h; y++) {
                    for (int x = 0; x < img_w; x++) {
                        dst_img[count] = src_img[xs_tab[y] + ys_tab[x]];
                        count++;
                    }
                }
                return;
        }
    }

в общем вот, может кому ещё понадобиться. всё работает

гость 22.05.2010 15:49

что за говнокод вы тут запостили. ему место на dailywtf толька

делается все гораздо проще

for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
dst_img[x * height + y] = src_img[y * width + x];


Часовой пояс GMT +4, время: 03:40.