Поворот и настройка изображения в Java [дубликат]

TL; DR: сделайте это вместо

. Его гораздо проще и читабельнее использовать функцию, чем псевдоним, чтобы поставить аргументы в середине команды.

$ wrap_args() { echo "before $@ after"; }
$ wrap_args 1 2 3
before 1 2 3 after

Если вы читаете, вы узнаете, что вам не нужно знать о обработке аргументов оболочки. Знание опасно. Просто получите желаемый результат, прежде чем темная сторона навсегда контролирует вашу судьбу.

Уточнение

bash aliases do принимает аргументы, но только на end :

$ alias speak=echo
$ speak hello world
hello world

Ввод аргументов в средний команды через alias действительно возможен, но он становится уродливым.

Не пытайтесь это дома, детишки!

Если вам нравится обходить ограничения и делать то, что говорят другие, это рецепт. Просто не обвиняйте меня, если ваши волосы становятся измотаны, а ваше лицо заканчивается тем, что покрыто сухим безумным ученого.

Обходной путь состоит в том, чтобы передать аргументы, которые alias принимает только в конце (g7) Решение 1

Если вы действительно против использования функции как таковой, вы можете использовать:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Вы можете заменить $@ на $1, если вам нужен только первый аргумент.

Объяснение 1

Это создает временную функцию f, которая передаются аргументы (обратите внимание, что f вызывается в самом конце). unset -f удаляет определение функции по мере того, как выполняется псевдоним, после чего он не зависает.

Решение 2

Вы также можете использовать подоболочку:

$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'

Пояснение 2

Псевдоним строит команду:

sh -c 'echo before "$@" after' _

Комментарии:

  • Требуется заполнитель _ , но это может быть что угодно. Он устанавливается в sh $0 и требуется, чтобы первый из аргументов, заданных пользователем, не потреблялся. Демонстрация:
    sh -c 'echo Consumed: "$0" Printing: "$@"' alcohol drunken babble
    Consumed: alcohol Printing: drunken babble
    
  • Требуются одиночные кавычки внутри одиночных кавычек. Вот пример того, что он не работает с двойными кавычками:
    $ sh -c "echo Consumed: $0 Printing: $@" alcohol drunken babble
    Consumed: -bash Printing:
    
    Здесь значения интерактивной оболочки $0 и $@ заменены на двойные кавычки перед , которые передаются на sh. Вот доказательство:
    echo "Consumed: $0 Printing: $@"
    Consumed: -bash Printing:
    
    Одиночные кавычки гарантируют, что эти переменные не интерпретируются интерактивной оболочкой и передаются буквально в sh -c. Вы можете использовать двойные кавычки и \$@, но лучше всего привести свои аргументы (поскольку они могут содержать пробелы), а \"\$@\" выглядит еще более уродливым, но может помочь вам выиграть конкурс по запутыванию, где измотанные волосы являются предпосылкой для запись.
8
задан Andrew Thompson 31 December 2012 в 07:58
поделиться

3 ответа

Вы должны использовать тригонометрию, чтобы определить правильную ширину / высоту, используя прозрачность, чтобы предотвратить черную область, и я думаю, что Трансформация неверна, что делает ее недоступной.

Попробуйте следующее:

public static BufferedImage rotate(BufferedImage image, double angle) {
    double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
    int w = image.getWidth(), h = image.getHeight();
    int neww = (int)Math.floor(w*cos+h*sin), newh = (int) Math.floor(h * cos + w * sin);
    GraphicsConfiguration gc = getDefaultConfiguration();
    BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.TRANSLUCENT);
    Graphics2D g = result.createGraphics();
    g.translate((neww - w) / 2, (newh - h) / 2);
    g.rotate(angle, w / 2, h / 2);
    g.drawRenderedImage(image, null);
    g.dispose();
    return result;
}

private static GraphicsConfiguration getDefaultConfiguration() {
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd = ge.getDefaultScreenDevice();
    return gd.getDefaultConfiguration();
}

из http://flyingdogz.wordpress.com/2008/02/11/image-rotate-in-java-2-easier-to-use/

16
ответ дан Nishi 21 August 2018 в 01:36
поделиться
  • 1
    Это действительно здорово. Однако у меня есть одна проблема. Моему изображению нужно только поворачивать на 90 градусов. вовремя. Если я пройду в 90 для угла, он фактически повернет более чем на 90 градусов – user489041 11 November 2010 в 18:45
  • 2
    Это использует радианы, поэтому сначала используйте Math.toRadians (степень). – Reverend Gonzo 11 November 2010 в 19:54
  • 3
    Работал как шарм. Благодаря! – user489041 11 November 2010 в 19:59
  • 4
    +1 потрясающий:) ... – David Kroukamp 13 January 2013 в 10:12

Помогает ли это вам:

BufferedImage DaImage = new BufferedImage(height, width, type);

to:

BufferedImage DaImage = new BufferedImage(**width, height**, type);?

0
ответ дан bjoernz 21 August 2018 в 01:36
поделиться
  • 1
    Да, я переключил их туда и обратно, до сих пор безуспешно. – user489041 11 November 2010 в 18:49

Вы можете попробовать использовать значок Rotated .

4
ответ дан camickr 21 August 2018 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: