2012-03-27 17 views
12
from Tkinter import * 
root = Tk() 
cv = Canvas(root) 
cv.create_rectangle(10,10,50,50) 
cv.pack() 
root.mainloop() 

मैं कैनवास सामग्री को बिटमैप या अन्य छवि में कनवर्ट करना चाहता हूं, और फिर छवियों को घूर्णन या स्केल करने या इसके निर्देशांक को बदलने जैसे अन्य संचालन करना चाहता हूं।मैं कैनवास सामग्री को किसी छवि में कैसे परिवर्तित कर सकता हूं?

बिटमैप्स यह दिखाने के लिए दक्षता में सुधार कर सकता है कि मैं अब ड्राइंग नहीं कर रहा हूं।

मुझे क्या करना चाहिए?

+0

क्रियालेख में यह पाइथन टिंकर में काम करने के तरीके को समझने के लिए ड्रा() फ़ंक्शन है? – liupeixin

उत्तर

14

आप या तो एक उपसंहार दस्तावेज़ (: ImageMagick, Ghostscript, आदि कुछ अन्य उपकरण में खिलाने के लिए): उत्पन्न कर सकते हैं

from Tkinter import * 
root = Tk() 
cv = Canvas(root) 
cv.create_rectangle(10,10,50,50) 
cv.pack() 
root.mainloop() 

cv.update() 
cv.postscript(file="file_name.ps", colormode='color') 

root.mainloop() 

या जनहित याचिका पर और Tkinter के कैनवास पर समानांतर में एक ही छवि आकर्षित (देखें: Saving a Tkinter Canvas Drawing (Python))। उदाहरण के लिए (एक ही लेख से प्रेरित):

from Tkinter import * 
import Image, ImageDraw 

width = 400 
height = 300 
center = height//2 
white = (255, 255, 255) 
green = (0,128,0) 

root = Tk() 

# Tkinter create a canvas to draw on 
cv = Canvas(root, width=width, height=height, bg='white') 
cv.pack() 

# PIL create an empty image and draw object to draw on 
# memory only, not visible 
image1 = Image.new("RGB", (width, height), white) 
draw = ImageDraw.Draw(image1) 

# do the Tkinter canvas drawings (visible) 
cv.create_line([0, center, width, center], fill='green') 

# do the PIL image/draw (in memory) drawings 
draw.line([0, center, width, center], green) 

# PIL image can be saved as .png .jpg .gif or .bmp file (among others) 
filename = "my_drawing.jpg" 
image1.save(filename) 

root.mainloop() 
9

मुझे ऐसा करने का एक शानदार तरीका मिला है जो वास्तव में सहायक है। इसके लिए, आपको पीआईएल मॉड्यूल की आवश्यकता है। यहां कोड है:

from PIL import ImageGrab 

def getter(widget): 
    x=root.winfo_rootx()+widget.winfo_x() 
    y=root.winfo_rooty()+widget.winfo_y() 
    x1=x+widget.winfo_width() 
    y1=y+widget.winfo_height() 
    ImageGrab.grab().crop((x,y,x1,y1)).save("file path here") 

यह क्या होता है कि आप फ़ंक्शन में विजेट नाम पास करते हैं। कमांड root.winfo_rootx() और root.winfo_rooty() कुल root विंडो के ऊपरी बाईं ओर स्थित पिक्सेल स्थिति प्राप्त करें।

फिर, widget.winfo_x() और widget.winfo_y() को मूल रूप से विजेट के शीर्ष बाएं हाथ पिक्सेल का पिक्सेल समन्वय प्राप्त होता है जिसे आप कैप्चर करना चाहते हैं (अपनी स्क्रीन के पिक्सल (x, y) पर)।

मुझे तब (x1, y1) मिलता है जो विजेट के निचले बाएं पिक्सेल है। ImageGrab.grab() एक प्रिंटरस्क्रीन बनाता है, और फिर मैं इसे केवल विजेट युक्त बिट प्राप्त करने के लिए फसल करता हूं। यद्यपि सही नहीं है, और सर्वोत्तम संभव छवि नहीं बनाएगा, यह किसी भी विजेट की छवि प्राप्त करने और इसे सहेजने के लिए एक शानदार टूल है।

यदि आपके कोई प्रश्न हैं, तो टिप्पणी पोस्ट करें! उम्मीद है कि यह मदद की!

+0

हाय, जब मैं कोड चलाता हूं तो यह तस्वीर बहुत जल्द बनाता है। क्या आप कृपया टिक्टर ग्राफिक्स के साथ एक उदाहरण स्क्रिप्ट पोस्ट कर सकते हैं और फिर इसे सहेज सकते हैं? हो सकता है कि मैं गलत समय पर फ़ंक्शन को रख या कॉल कर रहा हूं। –

+0

@EerikMuuli आपको केवल तस्वीर को कॉल करना होगा जब आप तस्वीर लेना चाहते हैं। उदाहरण के लिए, आप कमांड के साथ एक बटन प्राप्त कर सकते हैं, और बटन के कमांड के लिए फ़ंक्शन में, बस 'गेटर (x)' डालें जहां x विजेट है, या यहां तक ​​कि पूरी रूट विंडो भी है। यह कोई परेशानी नहीं होनी चाहिए। यदि आपको और समस्याएं हैं तो यहां एक टिप्पणी में जवाब दें। –

+0

ठीक है, मुझे पता चला कि समस्या कहां है - मैं अपना कोड यहां पेस्ट कर दूंगा। स्क्रिप्ट अब क्या करती है कि यह कैनवास को दो बार प्रिंट करता है और एक त्रुटि में चलता है - हालांकि इसे इसे एक बार खोलना चाहिए और 4.5 सेकंड के बाद इसे बंद करना चाहिए। यह "wut" 2 बार भी प्रिंट करता है जो वास्तव में अजीब है। यहां कोड है: http://pastebin.com/MPgABMEv –

संबंधित मुद्दे

 संबंधित मुद्दे