Как повернуть рисунок на произвольный угол без потери качества?

Yomin

Чем можно повернуть рисунок на произвольный угол без потери качества? Порекомендуйте бесплатную программу, которая может это делать? Спасибо!

Bibi

gimp

bestpilot8

Совсем без потери невозможно, если угол не кратен 90 градусам. Но с незаметными потерями вышеупомянутый Гимп тебе это вполне сделает.

dangerr

Для массового поворота лучше всего подойдет convert из ImageMagick:
mkdir ../rotated
find . -exec convert {} ../rotated/{} -rotate 180 \;
for i in ls *.jpg; do convert $i -rotate 180 ../rotated/$i; done

Yomin

Спасибо! - то, что нужно!

elena-kotenok75

рисунок на каком носителе? бумага?

yroslavasako

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

AlexV769

эта команда работать не будет.

evgen5555

mogrify вообще-то

Viktory-s

Самый навороченый из всех существующих методов это O-MOMS:
Можешь посмотреть как он даже на малых порядках делает все остальные.
http://bigwww.epfl.ch/demo/jrotation/start.php

serega1604

и никто даже не спросил, в каком формате рисунок храниццо.

agaaaa

Думаешь там векторная?

serega1604

все может быть, да и не векторные тоже по-разному поворачиваются в зависимости от формата.

dangerr

эта команда работать не будет.
Исправил

dangerr

mogrify вообще-то
Я предпочитаю оставлять оригиналы на всякий случай. ;)

serega1604

>Исправил
если будут файлы с пробелами - все равно не будет работать.

dangerr

Я не использую и никому не рекомендую использовать символ пробела в именах файлов.
Даже когда пользовался видной, ставил программы в c:/progra~1

serega1604

это не отменяет неправильность скрипта.

dangerr

Если предложишь его исправленную версию, никто не обидится. ;)

serega1604

find . -maept 1 -name "*jpg" | xargs -i bash -c "convert {} -rotate 180 ../rotated/{} "
как-то так, например.

nemec2707

никто не обидется.
щас уже другой человек обидится

Ivan8209


for i in `ls *.jpg`; do

Никогда не понимал гениев, пишущих такое странное.
Объясните мне, кто-нибудь, ну зачем делать это `ls *.jpg`,
если и без него всё прекрасно работает?
---
"...Видный ретроград-новатор."

vall

ls нужен чтоб вступить в говно пробелы

Ivan8209

> find . -maept 1 -name "*jpg"
Не менее гениальная конструкция, чем вышеупомянутая "`ls *.jpg`".
Чем это отличается от просто "ls *jpg | xargs ..."?
Если бы ты "-type f" писал или "-print0", было бы ещё как-то понятно.
Ещё. Когда используешь какую-либо странную команду,
очень полезно помнить, что именно она означает:

$ cd /bin && ls | xargs echo {} LOOK!
{} LOOK! [ cat chio chmod cp cpio csh date dd df domainname echo ed expr hostname kill ksh ln ls mkdir mt mv pax ps pwd rcmd rcp rm rmdir sh sleep stty sync tar test

---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

Ivan8209

> ls нужен чтоб вступить в говно пробелы
Вот и я про это подумал.
---
Q5: а нафига A4?
A5: чтоб сосать.

serega1604

информация к размышлению
null:~/tmp$ ls *1* 
2008.03.03-13.22.49.png 2009.05.13-22.09.54.png debian-20090117-kfreebsd-i386-install.iso pppoj.1.cpp script1.js
2009.05.13-22.07.03.png 2009.05.13-22.17.05.png libqca2_2.0.2-1_i386.deb psi_0.12.1-2_i386.deb

1 1:
null:~/tmp$ find . -maepth 1 -name "*1*"
./1 1
./2008.03.03-13.22.49.png
./2009.05.13-22.07.03.png
./debian-20090117-kfreebsd-i386-install.iso
./libqca2_2.0.2-1_i386.deb
./pppoj.1.cpp
./2009.05.13-22.09.54.png
./psi_0.12.1-2_i386.deb
./script1.js
./2009.05.13-22.17.05.png

ЗЫ я не утверждал что моя команда абсолютно правильная.

Ivan8209

> информация к размышлению
Вот и подумай над тем, что "ls" и "ls | cat"
рисуют совершенно разные картинки.
---
"Narrowness of experience leads to narrowness of imagination."

hwh2010

ls нужен чтоб вступить в пробелы
и как поможет?

:~$ ls|grep qwe
qwe
qwe qwe
:~$ for i in `ls qwe*`;do echo 1;done
1
1
1

serega1604

>Вот и подумай над тем, что "ls" и "ls | cat"
>рисуют совершенно разные картинки.
а теперь поиграем в игру найди 10 различий

Ivan8209

> а теперь поиграем в игру найди 10 различий
У тебя или COLUMNS выставлена неправильно, или что-то сломано.
Терминалы или сам ls --- без разницы.
Классическое поведение такое:

$ ls /bin
[ cpio domainname kill mt rcmd sleep
cat csh echo ksh mv rcp stty
chio date ed ln pax rm sync
chmod dd expr ls ps rmdir tar
cp df hostname mkdir pwd sh test
$ ls /bin | cat
[
cat
chio
chmod
cp
cpio
csh
date
dd
df
domainname
echo
ed
expr
hostname
kill
ksh
ln
ls
mkdir
mt
mv
pax
ps
pwd
rcmd
rcp
rm
rmdir
sh
sleep
stty
sync
tar
test

---
"Narrowness of experience leads to narrowness of imagination."

vall

ты успешно в них и вступил. рад?

hwh2010

рад?
нет. Вступить я мог бы и без ls. Ладно, туплю я

Ivan8209

> и как поможет?
Прекрасно помогает:

$ :> /tmp/test
$ :> "/tmp/another test"
$ ls /tmp | grep test
another test
test
$ for f in /tmp/*test; do echo $f; done
/tmp/another test
/tmp/test
$ for f in `ls /tmp/*test`; do echo $f; done
/tmp/another
test
/tmp/test

---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

serega1604

>У тебя или COLUMNS выставлена неправильно, или что-то сломано.
>Терминалы или сам ls --- без разницы.
ты неправ - ничего не сломано и COLUMNS выставлена правильно.
про то как должно выглядеть классическое поведение я в курсе, просто решил что нельзя такую явную ошибку оставлять незамеченной.

dangerr

Что-то мне ну уж очень захотелось выложить пример своего быдлокодерства на шеле. ;)
Скрипт предполагая в текущей директории tiff-файлы с будущими шпорами, выдает два djvu файла odd.djvu и even.djvu, которые потом можно распечатать на разных сторонах и получить двухстронные шпоры с четным файлом на одной стороне и с нечетным на другой.
 

#!/bin/sh

k=0
mkdir odd
mkdir even
mkdir -p res/odd
mkdir -p res/even
mkdir -p djvu/odd
mkdir -p djvu/even

for i in `ls *.tiff`
do
if expr $k = 0
then
cp $i ./even
k=1
else
cp $i ./odd
k=0
fi
done

k=0
ind=1000
for i in `ls odd/*.tiff`
do
case $k in

0)
f0=$i
k=1
;;
1)
f1=$i
k=2
;;
2)
f2=$i
k=3
;;
3)
f3=$i
k=4
;;
4)
f4=$i
k=5
;;
*)
k=0
f5=$i
montage -geometry +0+0 $f0 $f1 $f2 $f3 $f4 $f5 ./res/odd/$ind.tiff
;;
esac
ind=$(expr $ind + 1)
done
montage -geometry +0+0 $f0 $f1 $f2 $f3 $f4 $f5 ./res/odd/$ind.tiff

k=0
ind=1000
for i in `ls even/*.tiff`
do
case $k in

0)
f0=$i
k=1
;;
1)
f1=$i
k=2
;;
2)
f2=$i
k=3
;;
3)
f3=$i
k=4
;;
4)
f4=$i
k=5
;;
*)
k=0
f5=$i
montage -geometry +0+0 $f2 $f1 $f0 $f5 $f4 $f3 ./res/even/$ind.tiff
;;
esac
ind=$(expr $ind + 1)
done
montage -geometry +0+0 $f2 $f1 $f0 $f5 $f4 $f3 ./res/even/$ind.tiff


for i in `ls ./res/odd`; do cjb2 ./res/odd/$i ./djvu/odd/$i.djvu; done
for i in `ls ./res/even`; do cjb2 ./res/even/$i ./djvu/even/$i.djvu; done
djvm -c odd.djvu `ls ./djvu/odd/*.djvu`
djvm -c even.djvu `ls ./djvu/even/*.djvu`
rm -rf res
rm -rf djvu

Интересно за это у многих возникнет желание меня анально покарать?

Ivan8209

> Интересно за это у многих возникнет желание меня анально покарать?
Нет, потому что большинство точно такие же кодеры.
> for i in `ls odd/*.tiff`
> djvm -c odd.djvu `ls ./djvu/odd/*.djvu`
Интересно, ты вообще, читаешь, что тебе пишут, или нет?
> cp $i ./even
В таких случаях лучше делать "ln -s" или "ln".
> ind=$(expr $ind + 1)
Даже в альмквистовых оболочках есть $expr но это ладно.
Ну и обычная проблема с параллельным исполнением скриптов,
мантра на сегодня --- mktemp(1).
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

dangerr

Интересно, ты вообще, читаешь, что тебе пишут, или нет?
Я этот скрипт раньше намного написал. Теперь само собой так писать не стану. :) Но не исправлять же это во всех своих старых скриптах.
 
В таких случаях лучше делать "ln -s" или "ln".
Спасибо, хорошее замечание.
 
Даже в альмквистовых оболочках есть $expr но это ладно.
Каких оболочках? Даже гугл о таких не знает
http://www.google.ru/search?q=%D0%B0%D0%BB%D1%8C%D0%BC%D0%BA...
Вообще я что-то подобное видел в чужих скриптах, но сам учился шелу по книге Кернигана и Пайка, которой лет наверное больше чем мне самому. :)
 
мантра на сегодня --- mktemp(1).
Что-то после прочтения мана так и не понял что оно такого сверхординароного делает. Если ты про то, что можно запустить одновременно два экземпляра одного и того же скрипта, то я по заветам той же книги называю временные файлы с $$ на конце. Только этого скрипта подобное не касается. он работает в текущей директории, а смысла запускать его дважды в одной и той же директории нет. Если перенесу временные файлы в /tmp то припишу к ним $$
Вообще я думал, самое большое негодование вызовет странный case. Чую можно это более по-человечески сделать, но не знаю как.

Ivan8209

> Но не исправлять же это во всех своих старых скриптах.
Исправлять. А то так всю жизнь и будешь без пробелов жить.
> Каких оболочках? Даже гугл о таких не знает
Чё?
http://www.google.com/search?q=almquist+shell
> Вообще я что-то подобное видел в чужих скриптах, но сам учился
> шелу по книге Кернигана и Пайка, которой лет наверное больше
> чем мне самому.
Прочитать sh(1) несложно, он короткий.
> Если ты про то, что можно запустить одновременно два
> экземпляра одного и того же скрипта, то я по заветам той же
> книги называю временные файлы с $$ на конце.
Где-то на сайте CERT или чего-то подобного лежит руководство,
где объяснено, почему такого делать не надо.
> Вообще я думал, самое большое негодование вызовет странный case.
> Чую можно это более по-человечески сделать, но не знаю как.
Да, это ужасно, но чутьё может быть обманчиво:

a=1
eval b$a=2
eval echo '$'b$a

---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

dangerr

Прочитать sh(1) несложно, он короткий.
1300 строк на английском на мой взгляд многовато :)
я быстрее и легче прочту пару глав в книжке на русском.
Где-то на сайте CERT или чего-то подобного лежит руководство,
где объяснено, почему такого делать не надо.

Ну а вкратце можешь сказать что не так?
Да, это ужасно, но чутьё может быть обманчиво:

a=1
eval b$a=2
eval echo '$'b$a


Замечательно, спасибо, внесу в скрипт. Это его чуть ли не в 2 раза укоротит по количеству строк.

Ivan8209

> Ну а вкратце можешь сказать что не так?
Ищи где-то там.
> Это его чуть ли не в 2 раза укоротит по количеству строк.
Иногда проще переписать всё на настоящем языке программирования (фортране
например --- TCL.
---
"This user is BSD-compliant."

dangerr

Иногда проще переписать всё на настоящем языке программирования (фортране
Думаю не в моем случае. :)
Оставить комментарий
Имя или ник:
Комментарий: