2015-04-29 5 views
0

В настоящее время я пытаюсь написать программу, которая читает GIF-файл, отображает его изображение на экране, а затем позволяет пользователю выбирать прямоугольную часть изображения для «копирования и вставки», , AKA, чтобы затем скопировать изображение в прямоугольник, а затем сохранить результат как новый GIF-файл. Я довольно далеко справился с этим, но каждый раз, когда я думаю, что понял, похоже, что появляется новая ошибка!«копировать и вставлять» программу python

# CopyAndPaste.py 

# This program is designed to read a GIF file, display its image on the screen, allows the user to 
# select a rectangular portion of the image to copy and paste, and then save the result as a new GIF file 

import tkinter 
from tkinter import * 
import base64 

root = Tk() 

def action(canvas): 
    canvas.bind("<Button-1>", xaxis) 
    canvas.bind("<ButtonRelease-1>", yaxis) 
    canvas.bind("<ButtonRelease-1>", box) 

def xaxis(event): 
    global x1, y1 
    x1, y1 = (event.x - 1), (event.y - 1) 
    print (x1, y1) 

def yaxis(event): 
    global x2, y2 
    x2, y2 = (event.x + 1), (event.y + 1) 
    print (x2, y2) 

def box(event): 
    photo = PhotoImage(file="picture.gif") 
    yaxis(event) 
    canvas.create_rectangle(x1,y1,x2,y2) 
    for x in range(x1, x2): 
     for y in range(y1, y2): 
      r,g,b = getRGB(photo, x, y) 
      newImage(r, g, b, x, y) 

def getRGB(photo, x, y): 
    value = photo.get(x, y) 
    return tuple(map(int, value.split(" "))) 

def newImage(r, g, b, x, y): 
    picture = PhotoImage(width=x, height=y) 
    picture.put("#%02x%02x%02x" % (r,g,b), (x,y)) 
    picture.write('new_image.gif', format='gif') 

canvas = Canvas(width=500, height=250) 
canvas.pack(expand=YES, fill=BOTH) 
photo = PhotoImage(file="picture.gif") 
canvas.create_image(0, 0, image=photo, anchor=NW) 
canvas.config(cursor='cross') 
action(canvas) 

root.mainloop() 
+7

Какая ошибка вы получаете? – Loocid

+0

Пожалуйста, попробуйте разделить свой вопрос и немного поподробнее. В настоящее время вы запрашиваете полный инструмент, который не находится в теме этой страницы, и затрудняет людям работу – frlan

ответ

0

Основная проблема с вашим кодом является то, что вы создаете новый PhotoImage для каждого пикселя! Вместо этого создайте PhotoImage один раз и просто добавьте пиксели в double-for -loop.

def box(event): 
    yaxis(event) 
    canvas.create_rectangle(x1, y1, x2, y2) 

    picture = PhotoImage(width=(x2-x1), height=(y2-y1)) 
    for x in range(x1, x2): 
     for y in range(y1, y2): 
      r, g, b = photo.get(x, y) 
      picture.put("#%02x%02x%02x" % (r, g, b), (x-x1, y-y1)) 
    picture.write('new_image.gif', format='gif') 

Кроме того, линия tuple(map(int, value.split(" "))) в вашей getRGB функции не так, как value уже кортеж вы хотите создать, а не строка. 1) Как вы можете видеть, я просто «вложил» эту часть непосредственно в функцию box. Другая проблема заключалась в том, что вы написали скопированные пиксели в x и y, но вы должны записать их вместо x-x1 и y-y1.

Update 1:1) Похоже, возвращаемое значение PhotoImage.get зависит от версии Python/Tkinter вы используете. В некоторых версиях он возвращает кортеж, например (41, 68, 151), а в других - строку, например u'41 68 151'.

Update 2: Как отметил @Oblivion, вы можете на самом деле просто использовать параметр PhotoImage.writefrom_coords указать область изображения, которое будет сохранено в файл. С этой функцией box можно упростить как

def box(event): 
    yaxis(event) 
    canvas.create_rectangle(x1, y1, x2, y2) 
    photo.write('new_image.gif', format='gif', from_coords=[x1, y1, x2, y2]) 
+2

photo.write ('savetest.gif', format = 'gif', from_coords = [x1, y1, x2, y2]) должно быть достаточным для сохранения выбранной области. – Oblivion

+0

@Oblivion Спасибо, я не знал этого. Добавил его к моему ответу. –

Смежные вопросы