powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ли это ускорить
25 сообщений из 76, страница 3 из 4
Можно ли это ускорить
    #39345239
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Сэмпл дай, а то у каждого своё понимание о качестве.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345242
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяBlazkowicz,
я понимаю юмор, но в данном случае, я просто обратился из-за того , что засомневался, что может что-то напутал или не оптимально применил.
Схера ли это юмор? Это инженерный подход к решению задач. А у тебя получается "вот у меня 2 строчки кода, как мне их поменять местами чтобы было быстрее? (сам код менять нельзя, иначе не красиво)"
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345251
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczвадя,

Сэмпл дай, а то у каждого своё понимание о качестве.
проще код.
требования нормализовать картинку по ширине 600px, т.е. maxWidth=600, высота как получится , пропорции сохраняются
входные картинки - фотки со смартфона 2500+ х 3500+ точек

код абсолютно сырой, одно достоинство - работоспособный, поэтому поводу прошу не высказываться.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
private void processImage(int maxWidth, int maxHeight, ByteBuffer src) {
        try {
            InputStream in;
            in = new ByteArrayInputStream(copyOfRange(src.array(), 24, src.limit())); //24 - это место откуда у меня начинается бинарный код jpg картинки, 
            BufferedImage bi = ImageIO.read(in);

            double max;
            int size;
            int ww = maxWidth - bi.getWidth();
            int hh = maxHeight - bi.getHeight();

            if (ww < 0 || hh < 0) {
//                if (ww < hh) {
//                    max = maxWidth;
//                    size = bi.getWidth();
//                } else {
//                    max = maxHeight;
//                    size = bi.getHeight();
//                }
                max = maxWidth;
                size = bi.getWidth();

                if (size > 0 && size > max) {
                    double trans;
                    AffineTransformOp op;
                    BufferedImage bi2 = null;
                    AffineTransform tr;

                    int step = (int) Math.ceil(Math.log(size / max) / Math.log(2.0));
                    trans = Math.pow(2, step - 1);
                    Double w = maxWidth * trans;
                    Double h = ((double) bi.getHeight() / (double) bi.getWidth()) * maxWidth * trans;
                    trans = h / bi.getHeight();

                    while (step-- != 0) {
                        tr = new AffineTransform();
                        tr.scale(trans, trans);
                        op = new AffineTransformOp(tr, AffineTransformOp.TYPE_BICUBIC);
                        bi2 = new BufferedImage(w.intValue(), h.intValue(), bi.getType());
                        op.filter(bi, bi2);
                        if (step == 0) {
                            break;
                        }
                        bi = bi2.getSubimage(0, 0, w.intValue(), h.intValue());

                        trans = .5;
                        w = w / 2;
                        h = h / 2;

                    }
                    try {
                        UUID uuid = UUID.randomUUID();
                        ImageIO.write(bi2, "jpg", new File("C:\\Temp\\xxx\\" + uuid.toString() + ".jpg"));
                    } catch (IOException ex) {
                        Logger.getLogger(Page5.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Page5.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345258
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz(сам код менять нельзя, иначе не красиво)
)) вадя в своём стиле).
вадяжду с нетерпением
да!
У меня проект завтра как раз на сжатие).
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345263
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
я про алгоритм, код пожалуйста.
я прошел путь выбора алгоритма, поэтому знаю о чём говорю.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345283
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяя прошел путь выбора алгоритма, поэтому знаю о чём говорю.
да кто же тебе поверит....на словах? )))
19879740
Потом будешь говорить, что у тебя тоже самое).
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345298
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНе совсем. Одни искажения теряют информацию, другие её размывают. В этом ключевая разница.
Это ты хорошо сказал.

P.S. Разница в алгоритмах восстановления картинки в системе глаз-мозг человека. Ну и исходном материале. Одни искажения будут лучше подходить другие хуже. Но увы информация будет теряться всегда (в отличии, как ты правильно заметил от увеличения - там ее надо придумывать).
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345300
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Давай завтра сравним твоё и библиотечное выше по ссылке.
Так там по ссылке один из вариантов его и есть. 1/2 step Bicubic Progressive Scaling называется. Если я чего не путаю.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345366
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,
ТС он? Вот и пусть работает, доказывает кодом что у него не хуже.
А обычно у него таки хуже.).
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345368
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
всё-таки можешь объяснить, зачем здесь афинные преобразования? Пропорции картинки не меняются, нет вращения, ведь очевидно, что результат будет тот же, что и для graphics.drawImage. Нафига решать систему уравнений, если ответ известен? Вот же оно то место, где явно пустая работа делается
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345376
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraвсё-таки можешь объяснить, зачем здесь афинные преобразования?
Картинку сглаживать же. Метод интерполяции на это влияет.

P.S. Возможно действительно можно оставить кубическую аппроксимацию только для некратного сжатия, а последующие кратные 2-м делать линейными. Скорее всего результат будет не сильно отличаться. Но Вадя гонится за качеством.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345381
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ТС он? Вот и пусть работает, доказывает кодом что у него не хуже.
А обычно у него таки хуже.).
Так он же и показал. У него действительно последовательно сжатие с двумерной кубической интерполяцией и шагом 1/2.
Единственное IMHO лишними выглядят телодвижения с getSubImage и проверкой последнего шага. Но по сравнению с математикой в алгоритме это копейки.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345386
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевivanraвсё-таки можешь объяснить, зачем здесь афинные преобразования?
Картинку сглаживать же. Метод интерполяции на это влияет.
Интерполяция применяется и в drawImage, афинные преобразования в данном случае не требуются:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Map<Key, Object> hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
hints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
...
Graphics2D graphics = resizedImage.createGraphics();
try {
	graphics.setRenderingHints(hints);
	graphics.drawImage(source, 0, 0, width, height, null);
} finally {
	graphics.dispose();
}
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345396
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,
Показал качество сжатия? Время работы? Сравнительный тест?
As is to be.
У него всегда так - кинул код, разбирайтесь сами.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345422
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraИнтерполяция применяется и в drawImage, афинные преобразования в данном случае не требуются:
ЕМНИП геометрическое сжатие картинки это и есть частный случай афинных преобразований.

P.S. https://docs.oracle.com/javase/8/docs/api/java/awt/RenderingHints.html#KEY_ANTIALIASING Antialiasing hint key. The ANTIALIASING hint controls whether or not the geometry rendering methods of a Graphics2D object will attempt to reduce aliasing artifacts along the edges of shapes .
На текстуры не должен действовать. :(
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345433
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевЕМНИП геометрическое сжатие картинки это и есть частный случай афинных преобразований.
Вот я и говорю об идентичности результатов. Рисуем сразу, не решая уравнений.

А еще в приведенном коде режет глаз нахождение целого логарифма по основанию 2, ну и возведение 2 в степень тоже.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345437
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraВот я и говорю об идентичности результатов. Рисуем сразу, не решая уравнений.
За нас их решит Graphics2D. Правда и у TC это делает AffineTransformOp. :)
ivanraА еще в приведенном коде режет глаз нахождение целого логарифма по основанию 2, ну и возведение 2 в степень тоже.
Ну это теплый ламповый звук. Картинка полученная методом последовательных приближений с накоплением ошибок выглядит субъективно лучше сделанной за один проход.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345464
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА еще в приведенном коде режет глаз нахождение целого логарифма по основанию 2, ну и возведение 2 в степень тоже.
это мелочи, зато хорошо показывает алгоритм получения значения.

авторУ него всегда так - кинул код, разбирайтесь сами.
там всё элементарно
дай твой код , я разберусь, чтоб сравнить.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345483
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Я велосипеды не пишу. Выше ссылку на код 3 раза давал.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345808
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Код: java
1.
in = new ByteArrayInputStream(copyOfRange(src.array(), 24, src.limit())); //24 - это место откуда у меня начинается бинарный код jpg картинки,


занафига тут эта строка и почему в процедуре не входной параметр стрим картинки?
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345817
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
тебе по оформлению кода и по уважению к мемберам читающим твой код - сюда. В первый класс:
Передать в Java BLOB и получить BLOB.
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345852
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяавторУ него всегда так - кинул код, разбирайтесь сами.
там всё элементарно
угу.
Мольбам юзверей с твоим кодом ты не внемлешь)))).
Так что давай со своим кодом сам.
А я с библиотекой по ссылке выше.
Итак:
- у меня юзвери (негодяи) сканируют 20 страниц документа в PDF и кидают в систему.
Т.к. их никто пока не ограничил), то они сканируют обычно вот так
(пример в сети абстрактный)
http://gump74.ru/media/docs/2014/10/22/1-list-polozheniya-s-pechatyami.jpg
разрешение 2480x3507 умноженное на 20 страниц и в систем у))).
Теперь ты уменьшай своим кодом насколько возможно и выложи результат.
Я выложу тоже
Код: java
1.
2.
3.
4.
5.
6.
7.
			
import org.imgscalr.Scalr;
...
File image = new File("c:\\_Buffer\\16.jpg");
BufferedImage img = ImageIO.read(image);
BufferedImage thumbnail = Scalr.resize(img, 800);
ImageIO.write(thumbnail, "jpg", new File("c:\\_Buffer\\16out.jpg"));
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345863
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выход с настройками по умолчанию
566х800 - 88,7Kb
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345866
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
по времени сам померяй.
Удачи!
...
Рейтинг: 0 / 0
Можно ли это ускорить
    #39345905
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
измерялось так
Код: java
1.
2.
3.
        st = System.nanoTime();
        processImage(600,  bb);
        System.err.println(System.nanoTime()-st);


838 299 619 мой метод
2 952 740 436 твой
...
Рейтинг: 0 / 0
25 сообщений из 76, страница 3 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ли это ускорить
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]