Online video hd

Смотреть 365 видео

Официальный сайт pepsilight 24/7/365

Смотреть видео бесплатно

pomkalk 19.07.2010 01:17

PythonПо ВТОРОЙ просьбе Craftuser: Меняем формат изображения прямо в nautilus'е

По просьбе Craftuser «Пиши что-нибудь действительно интересное, типа конвертера изображений, интегрируемого в контекстное меню Nautilus, жду.»

Новый интерфейс — новые возможности. (Сделано без использование Glade что бы обойтись одним файлом)

Я написал программу на python для конвертирования изображения с простейшим PyGTK интерфейсом(На все про все ушло 6 часов)

Что мы имеем

1
imageconvert.py ImageName — где ImageName имя картинки



Все что нужно, сохранить этот скрипт в файл(У меня называется imageconvert.py) с любым удобным именем, и сохранить в удобном для вас месте.

КОД:

  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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#!/usr/bin/env python

import os
import sys
import Image
try:
import pygtk
pygtk.require("2.0")
import gtk
except:
print "Cant load GTK"
sys.exit(1)

formats=

try:
rc = open(os.path.join(os.environ<'HOME'>,'.imconvrc'))
for i in rc.readlines():
if len(i.strip())&gt;0: formats.append(i.strip())
except:
formats=<'jpg','png','gif','bmp'>


class converter():

rotater = 0
new_format = None
sizer = 2

def make_changes(self,widget,data=None):
for i in sys.argv<1:>:
try:
self.im = Image.open(i)
except IOError, x:
self.msgbox(x)
sys.exit(1)
except:
self.msgbox("FATAL ERROR")
sys.exit(1)
self.f = os.path.splitext(i)<0>
self.r = os.path.splitext(i)<1>
self.x,self.y = self.im.size
if self.incr.get_active():
self.x=self.x*self.sizer
self.y=self.y*self.sizer
self.im = self.im.resize((self.x,self.y))
elif self.decr.get_active():
self.x=self.x/self.sizer
self.y=self.y/self.sizer
self.im = self.im.resize((self.x,self.y))
if self.rotater&gt;0:
self.im = self.im.rotate(self.rotater)
if self.flip_button_lr.get_active():
self.im = self.im.transpose(Image.FLIP_LEFT_RIGHT)
if self.flip_button_tb.get_active():
self.im = self.im.transpose(Image.FLIP_TOP_BOTTOM)
if not self.new_format:
if self.format_radio_other.get_active():
if len(self.format_entry.get_text())&gt;0:
self.new_format = self.format_entry.get_text()
else:
self.new_format = self.r<1:>
else:
self.new_format = self.r<1:>

try:
self.im.save(self.f+"."+self.new_format)
except:
if lf==1:
self.msgbox("Cant convert")
else:
print "Cant convert"
sys.exit(2)



sys.exit(0)

def msgbox(self,msg,title="Warning!"):
self.msgw = gtk.Window(type=gtk.WINDOW_TOPLEVEL)
self.msgw.set_modal(True)
self.msgw.set_border_width(5)
self.msgw.set_position(gtk.WIN_POS_CENTER_ALWAYS)
self.msgw.set_title(title)
self.msgw.set_resizable(False)
self.msgw.connect("delete_event",self.delete_event)
self.msgb = gtk.VBox(True,10)
self.msgw.add(self.msgb)
self.msgl = gtk.Label(msg)
self.msgb.pack_start(self.msgl,True,True,0)
self.msgl.show()
self.msgbb = gtk.HBox(False,0)
self.msgbb.show()
self.msgb.pack_start(self.msgbb,True,True,0)
self.msgbt = gtk.Button("Exit")
self.msgbb.pack_end(self.msgbt,True,False,5)
self.msgbt.connect("clicked",self.delete_event,self.msgw)
self.msgbt.show()
self.msgb.show()
self.msgw.show()
print msg
gtk.main()

def set_resize(self,widget,data):
self.sizer=data

def get_image(self,image_name,max_size):
self.pixbuf = gtk.gdk.pixbuf_new_from_file(image_name)
self.w,self.h = self.pixbuf.get_width(),self.pixbuf.get_height()
if self.w&gt;self.h:
self.h=(max_size*self.h)/self.w
self.w=max_size
else:
self.w=(max_size*self.w)/self.h
self.h=max_size
self.pixbuf = self.pixbuf.scale_simple(self.w,self.h,gtk.gdk.INTERP_BILINEAR)
self.im = gtk.Image()
self.im.set_from_pixbuf(self.pixbuf)
return self.im

def set_rotate(self,widget,data):
self.rotater = data


def flip_check(self,widget,data):
if data=="lr":
if self.flip_button_lr.get_active(): self.flip_button_tb.set_active(False)
else:
if self.flip_button_tb.get_active(): self.flip_button_lr.set_active(False)

def set_format(self,widget,data):
if data:
self.format_entry.set_editable(False)
self.format_entry.set_text("")
self.new_format = data
else:
if self.format_radio_none.get_active(): self.new_format=None
if self.format_radio_other.get_active():
self.format_entry.set_editable(True)
else:
self.format_entry.set_text("")
self.format_entry.set_editable(False)

def resize(self,widget,data):
if widget.get_active():
if data=="incr":
self.decr.set_active(False)
else:
self.incr.set_active(False)

def delete_event(self,widget,event,Data=None):
gtk.main_quit()
return False

def run(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title("Converter")
self.window.set_border_width(5)
self.window.set_position(gtk.WIN_POS_CENTER)
self.window.set_resizable(False)
self.window.connect("delete_event",self.delete_event)
self.mainbox = gtk.VBox(False,0)

self.preview_frame = gtk.Frame("Pre-view")
self.resize_frame = gtk.Frame("Resize")
self.flip_frame = gtk.Frame("Flip")
self.rotate_frame = gtk.Frame("Rotate (Throught left side)")
self.format_frame = gtk.Frame("New Format")

self.mainbox.pack_start(self.preview_frame,True,True,0)
self.mainbox.pack_start(self.resize_frame,True,True,0)
self.mainbox.pack_start(self.flip_frame,True,True,0)
self.mainbox.pack_start(self.rotate_frame,True,True,0)
self.mainbox.pack_start(self.format_frame,True,True,0)
if lf&gt;1:
self.preview_content = gtk.Label("Cant preview, because \n"+str(lf)+" images is selected")
self.preview_content.set_justify(gtk.JUSTIFY_CENTER)
else:
self.preview_content = self.get_image(sys.argv<1>,180)
self.preview_frame.add(self.preview_content)

self.resize_t = gtk.Table(2,4,False)
self.incr = gtk.ToggleButton("Increase")
self.decr = gtk.ToggleButton("Decrease")
self.incr.connect("toggled",self.resize,"incr")
self.decr.connect("toggled",self.resize,"decr")
self.resize_t.attach(self.incr,0,2,0,1)
self.resize_t.attach(self.decr,2,4,0,1)
self.parts=<2,3,4,5>
self.radio_parts=

for i in xrange(len(self.parts)):
if i==0:
self.radio_parts.append(gtk.RadioButton(None,"in "+str(self.parts<i>)))
else:
self.radio_parts.append(gtk.RadioButton(self.radio_parts<0>,"in "+str(self.parts</i><i>)))
self.radio_parts</i><i>.connect("toggled",self.set_resize,self.parts</i><i>)
self.resize_t.attach(self.radio_parts</i><i>,i,i+1,1,2)
self.resize_frame.add(self.resize_t)


self.flip_box = gtk.HBox(False,0)
self.flip_button_lr = gtk.ToggleButton("Left - Right")
self.flip_button_tb = gtk.ToggleButton("Top - Bottom")

self.flip_box.pack_start(self.flip_button_lr,True,False,0)
self.flip_box.pack_start(self.flip_button_tb,True,False,0)
self.flip_frame.add(self.flip_box)

self.rotate_box = gtk.HBox(True,0)
self.rotates=<90,180,270>
self.rotate_radio = gtk.RadioButton(None,"0")
self.rotate_radio.connect("toggled",self.set_rotate,0)
self.rotate_box.pack_start(self.rotate_radio,True,True,0)
for i in self.rotates:
self.rotate_radio = gtk.RadioButton(self.rotate_radio,str(i))
self.rotate_radio.connect("toggled",self.set_rotate,i)
self.rotate_box.pack_start(self.rotate_radio,True,True,0)
self.rotate_frame.add(self.rotate_box)

if lf==1:
try:
formats.remove(os.path.splitext(sys.argv<1>)<1><1:>)
except:
pass
self.format_box = gtk.VBox(False,0)
self.format_radio_none = gtk.RadioButton(None,"None")
self.format_radio_none.connect("toggled",self.set_format,None)
self.format_box.pack_start(self.format_radio_none,True,False,0)
for i in formats:
self.format_radio = gtk.RadioButton(self.format_radio_none,"to "+i)
self.format_radio.connect("toggled",self.set_format,i)
self.format_box.pack_start(self.format_radio,True,False,0)
self.format_radio_other = gtk.RadioButton(self.format_radio_none,"Other -->")
self.format_radio_other.connect("toggled",self.set_format,None)
self.format_box.pack_start(self.format_radio_other,True,False,0)
self.format_other_box = gtk.HBox(False,0)
self.formal_other_label = gtk.Label("Enter other format: ")
self.format_entry = gtk.Entry(5)
self.format_entry.set_size_request(40,self.format_entry.get_size_request()<1>)
self.format_entry.set_editable(False)
self.format_other_box.pack_start(self.formal_other_label,True,True,0)
self.format_other_box.pack_start(self.format_entry,True,True,0)
self.format_box.pack_start(self.format_other_box,True,True,0)
self.format_frame.add(self.format_box)

self.control_box = gtk.HBox(False,0)
self.apply_button = gtk.Button("Apply")
self.cancel_button = gtk.Button("Cancel")
self.apply_button.connect("clicked",self.make_changes)
self.cancel_button.connect("clicked",self.delete_event,self.window)
self.control_box.pack_start(self.apply_button,False,False,0)
self.control_box.pack_start(self.cancel_button,True,True,0)
self.mainbox.pack_start(self.control_box,True,True,0)
self.window.add(self.mainbox)
self.window.show_all()




if __name__ == "__main__":
conv = converter()
lf=len(sys.argv<1:>)
if lf&gt;0:
for i in sys.argv<1:>:
if not os.path.isfile(i):
print "This is not file:",i
sys.exit(1)
else:
conv.run()
gtk.main()

else:
conv.msgbox("Need image file")
</i>



Далее нужно добавить пункт контекстного меню в наутилус.

Для начала нужно установить nautilus-actions(если он не установлен), для этого наберите:

1
sudo apt-get install nautilus-actions



После установки, запускаем Nautilus Actions Configuration Tool из меню (System ? Preferences ? Nautilus Actions Configuration) или из командной строки

1
nautilus-actions-config-tool



В появившемся окне создаем новый Action (Пункт в контекстное миню)

Изменяем Context label на ваше название пункта в контекстном меню, и устанавливаем иконку в поле icon(на свое усмотрение)

Во вкладке «Command» устанавливаем поля path(Путь к программе) и поле parameters, которое должно быть %M, для того чтобы к программе подставился единственный параметр — полный путь выделенной картинки.

Во вкладке «Conditions» меняем значение filenames на «*.jpg;*.png;*.gif;*.bmp» + можно продолжить список интересующими вас форматами, а также снимаем галочку с Match Case(Что бы не было привязки к регистру)

Жмем сохранить и готово



Иногда бывает так что пункт меню не появляется для указанных в Conditions ? filenames форматов, мне помогло удаление пробелов между форматами

Ну и можно перезагрузить nautilus командой

1
nautilus -q




Дополнительные возможности

К дополнительным возможностям можно отнести возможность создания .imconvrc в корневом каталоге, что это значит, это значит что список форматов будет загружаться от туда(Главное помнить, что если файл пустой, список форматов не выведется, тогда для корректного отображения следует удалить файл).

Если файла нет используется стандартный набор форматов <'jpg','png','gif','bmp'>

.imconvrc имеет вид
1
2
jpg
gif


где каждый формат с новой строки


Может конвертировать несколько файлов одновременно(multiselect). а также изменять размер, отражать по вертикали и горизонтали, крутить(Против часовой стрелки) ижображение(я)

Внимание! Если картинка с таким именем существует,то перезаписывает, если сохранять в другом формате(которого в данной папке нет) создается новый(мне показалось что так будет удобней) но если нужно подправлю что бы сохранял отдельно!


Тэги:
+ 11 -
Похожие Поделиться

digiwhite 19.07.2010 06:40 #
+ 1 -
Еще можно добавить вызов скрипта в Nautilus Actions. Для пущей интеграции так сказать.
pomkalk 19.07.2010 07:11 #
+ 1 -
добавить пункт в контекстное меню nautilus'а

Это и делается с помощью nautilus-actions, если я правильно тебя понял
digiwhite 19.07.2010 07:50 #
+ 0 -
Угу, теперь вижу. По началу было не очивидно :)
solomenikm 19.07.2010 13:05 #
+ 0 -
С CR2 тоже работает? Оригинал оставляет или удаляет?
pomkalk 19.07.2010 13:18 #
+ 1 -
Создаёт файл с таким же именем другого формата. На счет CR2 не знаю, я только на jpg, png, gif и bmp проверял, если python и PIL поддерживает, то да.
ZED 19.07.2010 13:25 #
+ 2 -
Велосипеды изобретаем-с?
http://gnome-look.org/content/show.php/Audio%2BVideo%2BImage%2BText%2BISO+Convert?content=92533&PHPSESSID=e7511928f651e0a23394327a0f1711bb
xT 19.07.2010 14:26 #
+ 1 -
Может кому пригодится
karp 19.07.2010 13:55 #
+ 1 -
В проге можно найти помеченный комментариями блок кода и за комментировать три строчки( знаком # ) Это нужно для того что бы убрать имя конвертируемого изображения с формы, это кому как удобно, что бы форма не растягивалась при длинных именах файлов

Думаю лучше добавить что-то типа:
self.lf.set_ellipsize('PANGO_ELLIPSIZE_END')
Тогда если имя файла будет длинное, то метка обрежется с конца...
Как это в Python не знаю, поэтому уверен, что параметр указан не правильно
karp 19.07.2010 14:13 #
+ 1 -
Вот так:
self.lf.set_ellipsize(pango.ELLIPSIZE_END)
pomkalk 19.07.2010 19:45 #
+ 2 -
self.lf.set_ellipsize(pango.ELLIPSIZE_START)
Что бы конец строки был виден

Код уже подправил...Спасибо
leonike 19.07.2010 14:35 #
+ 0 -
Небольшое замечание, в Python конкатенацию строк лучше осуществлять не через оператор сложения, а следующим образом:

new_val = '%s%s' % (str_val1, str_val2)

Подобный код выполняется быстрее, емнип.

Сам писал анологичный скрипт и интегрировал его в Dolphin. Если кому-то надо, могу выложить.
antigluk 19.07.2010 15:53 #
+ 0 -
А есть возможность встраиваться в ту панельку слева, там где папки/эмблемы/etc.?
pomkalk 19.07.2010 19:18 #
+ 0 -
Как слава не знаю, а вот на тулбар в наутилусе галочку одну поставить нужно!
Craftuser 20.07.2010 21:43 #
+ 0 -
Литр пива тебя ждет в моем холодильнике, спасибо. Добавишь опцию изменения размеров (типичные разрешения, просто в два-три-четыре раза уменьшить/увеличить), удвою количество пива.
pomkalk 22.07.2010 02:42 #
+ 0 -
Готово...вот как то так...Чуть попозже еще доработаю...
Craftuser 23.07.2010 23:37 #
+ 0 -
Спасибо.

В хорошем качестве hd видео

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн