2011-08-12 12 views
9

Windows panosunda bir görüntü (jpg, png, vb.) Var. Onu bir dosyaya kaydetmek istiyorum. win32clipboard cevap gibi görünüyor, ancak her örnek metin ile fırsatlar bulabilirim. Bir resim dosyası verilen panoya yazmak - Python'daki pencere panosundan jpg veya png'yi nasıl okuyabilirim?

import win32clipboard 
win32clipboard.OpenClipboard() 
data = win32clipboard.GetClipboardData() 
with open(name, 'wb') as f: 
    f.write(data) 
win32clipboard.CloseClipboard() 

Ben de tersini yapmak istiyorum

TypeError: Specified clipboard format is not available 

ile başarısız sonra, panoya bir görüntü kopyalama.

+1

açık olduğunuzu Eğer yapabileceği wx modülünü kullanarak: http://stackoverflow.com/questions/2629907/wx-read-image-from-clipboard – blcArmadillo

+0

Basit bir komut satırı yardımcı programı yazmaya çalışıyorum ve şu anda wx kullanmıyorum, o yüzden oraya gitmemi tercih ediyorum. – foosion

cevap

16

Sadece Pillow kullanır: Kullanılması

from PIL import ImageGrab 
im = ImageGrab.grabclipboard() 
im.save('somefile.png','PNG') 
+0

Ben sadece bakıyordum, ama ben hem python 2.7 ve 3.2 ihtiyaç duyuyorum ve PIL 3,12 – foosion

+0

için uygun görünmüyor @foosion: Bence python 3.2 için önceden derlenmiş bir ikili var: http: //www.lfd .uci.edu/~ gohlke/pythonlibs/ – Gerrat

+0

Bu 2.7 için ölüdür. Win32clipboard versiyonuna birkaç satır eklemenin böyle çalışacağını umuyordum. – foosion

4

win32clipboard.GetClipboardData() işlevinin bir parametresi vardır. Varsayılan parametre, pano içeriğinin metin olarak olmasını istediğinizi belirtir. Pano'nun size vermesini istediğiniz veri formatını belirten değeri iletmeniz gerekir.

Standart pano veri biçimleri, here belgelenmiştir. AYRICA

: -

EnumClipboardFormats() ilgili belgeleri için here bakınız temelde, şu anda panoya mevcuttur biçimleri almak için bu (denenmemiş) gibi kodu gerekir:

formats = [] 
lastFormat = 0 
while 1: 
    nextFormat = win32clipboard.EnumClipboardFormats(lastFormat) 
    if 0 == nextFormat: 
     # all done -- get out of the loop 
     break 
    else: 
     formats.append(nextFormat) 
     lastFormat = nextFormat 
# when you get here, formats contains a list of format codes that 
# you can retrieve from the clipboard right now. 
+0

Sadece numaralandırma numaralarını denedim ve 49353, 0, 8, 0, 0, 0, 0, 17, 0 var. Sadece 49353 kullanıyor muyum? win32clipboard.OpenClipboard (49353) hatayla sonuçlanır: (1400, 'OpenClipboard', 'Geçersiz pencere tanıtıcıları') – foosion

+0

Biçimlendirme kodlarının ne olduğuyla ilgili belgeleri içeren sayfayı gördünüz mü? 8, her ikisi de bitmap verisini içeren "BITMAPINFO" ve 7 "BITMAPV5HEADER" dır. Windows'un görüntüleri nasıl işlediğinden daha fazla öğrenmeye ihtiyacınız olabilir ... – bgporter

+0

http://msdn.microsoft.com/en-us/library/ff729168(v=VS.85 adresinde listelenen kodların hiçbiri) .aspx 49353 kadar yüksek gidin. Sonraki değer BITMAPINFO yapısı olan 8, ama ben bununla ne yapacağımı açık değilim – foosion

4

Aradığınız parametrenin biçimini belirten GetClipboardData parametresini bir parametreyi iletmeniz gerekir. Kullanılabilen formatları görmek için EnumClipboardFormats'u kullanabilirsiniz - Explorer'da bir şey kopyaladığımda 15 format mevcut.

Düzenleme 2: Explorer'da bir dosya kopyaladıktan sonra bir dosya adı almak için kod. Örneğin, bir programın içinden bir görüntüyü kopyaladıysanız cevap tamamen farklı olacaktır.

import win32clipboard 
win32clipboard.OpenClipboard() 
filename_format = win32clipboard.RegisterClipboardFormat('FileName') 
if win32clipboard.IsClipboardFormatAvailable(filename_format): 
    input_filename = win32clipboard.GetClipboardData(filename_format) 
win32clipboard.CloseClipboard() 

Düzenleme 3: sözlerinden Eğer, panoya bir görüntü dosyasının değil dosya adını gerçek görüntü var ortada. Kendini çok, PIL kullanamaz belirtti ettik: Bu noktada

import win32clipboard 
win32clipboard.OpenClipboard() 
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_DIB): 
    data = win32clipboard.GetClipboardData(win32clipboard.CF_DIB) 
win32clipboard.CloseClipboard() 

görüntü verilerini içeren bir (Python 2'de) dize veya (Python 3'te) bayt var. Kaydedebildiğiniz tek biçim .BMP'dir ve dosyanın ön tarafına yazılması gereken BITMAPFILEHEADER parametrelerini almak için BITMAPINFOHEADER kodunu çözmeniz gerekir.

+0

Kendimden bir dosya adı oluşturabilirim. EnumClipboardFormats() ile 0'dan başlayarak mı geçiyorum? Sonuçlarla ne yapacağım? – foosion

+0

@foosion, panonun içinde tam olarak ne olduğunu açıklayabilir misiniz? Bir programda veya Explorer'da bir dosya adında görüntülenen bir görüntüde bir Kopyalama yaptınız mı? –

+0

Mevcut testlerim bir görüntüyü bir web tarayıcısındaki ve bir boya programından kopyalamaktır. Ayrıca, lütfen bgporter – foosion

2

PythonMagick (binaries):

from PythonMagick import Image 
Image("clipboard:").write("PNG32:clipboard.png") # clipboard -> file 
Image("clipboard.png").write("clipboard:") # file -> clipboard 
+0

Bu, hem klip-> dosya hem de dosya klibi ümit vaat ediyor ve hatta destekliyor. – foosion

İlgili konular