2016-04-08 15 views
0

Bir görüntünün bir alanındaki tüm pikselleri "yakalama" (ekrana çizilen dikdörtgen nesnesinin genişliği ve yüksekliği ile belirlenen alan) ve yeni bir görüntü oluşturmaya çalışıyorum Orijinal görüntüden yakalanan pikselleri içeren.Pikselleri yakalayın ve yeni resim oluşturun

Sorun şu ki, çalıştırdığımda indeksin aralık dışı/koordinat sınırları dışına çıkarılmasıdır. Bir chord_pixels dizisinin uzunluğunu (dikdörtgenin genişliği ile aynı olması gereken satır sayısını elde etmek için) ve chord_pixels [0] uzunluğunu yazdırmayı denedim (aynı olması gereken sütun sayısını elde etmek için) Dikdörtgenin yüksekliği olarak) ve bunların çoğu zaman yeni görüntünün yüksekliğinden ve genişliğinden çok farklı olduğu ortaya çıkıyor (piksellerin geldiği dikdörtgenle aynı boyutta). Fark genellikle 100'den fazladır. Bunu saatlerce gözetledim ve çok aptal olanlar da dahil olmak üzere bir ton fikirleri denedim. Şimdi bunu internete teklif ediyorum.

img = Icon("name") 
d = Display("name", 1000, 1000) 
img.setSize(1000,1000) 
d.add(img) 

beginX,beginY,endX,endY = 0,0,0,0 
chord_pixels = [] 
rect = Rectangle(0,0,0,0) 

def beginRectangle(x,y): 
    global beginX, beginY 
    ... 
    beginX, beginY = x, y 

def drawRectangle(x,y): 
    global beginX, beginY, endX, endY, rect 
    ... 
    if rect in d.getItems(): 
     d.remove(rect)  
    endX, endY = x,y 
    rect = Rectangle(beginX, beginY, endX, endY, Color.BLACK, False, thickness=3) 
    d.add(rect)  

def endRectangle(x,y): 
    global beginX, beginY, endX, endY, img 
    ... 
    getPixelsInRectangle(img, beginX, beginY, endX, endY) 

def getPixelsInRectangle(image, x1, y1, x2, y2): 
    global chord_pixels 
    row_pixels = [] 
    chord_pixels = [] 
    for y in range(y1,y2):   
     for x in range(x1, x2):  
     pixel = img.getPixel(int(y),int(x)) #getPixel(col, row) 
     row_pixels.append(pixel) 
     chord_pixels.append(row_pixels) 
     row_pixels = [] 

def captureChordPixels(key): 
    global chord_pixels, rect 
    chordWindow = Image(rect.getWidth(), rect.getHeight()) 
    for col in range(chordWindow.getHeight()): 
     for row in range(chordWindow.getWidth()): 
     chordWindow.setPixel(col, row, chord_pixels[col][row]) 

d.onMouseDown(beginRectangle) 
d.onMouseDrag(drawRectangle) 
d.onMouseUp(endRectangle) 
d.onKeyDown(captureChordPixels) 
+0

Açık olmak gerekirse, yapmak istediğiniz tüm w, orijinal görüntüden verilen x bir alt görüntü elde alt görüntünün h y? – Keatinge

cevap

1

PIL'yi kullanmayla ilgili sorun yoksa oldukça kolaydır.

crop(), sol, üst, sağ ve alt piksel koordinatlarını tanımlayan 4 öğeli bir tuple'ı kabul eder. (X1, y1, x2, y2)

im = Image.open("image.png") 
x1 = 0 
y1 = 0 
x2 = 500 
y2 = 100 
croppedImg = im.crop((x1,y1,x2,y2)) 
croppedImg.save("new-img.png") 
+0

Vay. Çok zaman harcadım gibi hissediyorum. (Çünkü gerçekten yaptım). Teşekkürler! – emattbax

İlgili konular