【问题标题】:How to divide a picture into evenly spaced squares with python?如何用python将图片分成均匀间隔的正方形?
【发布时间】:2019-10-18 02:45:22
【问题描述】:

我正在尝试使用 PIL 并定义我自己的函数,该函数将图像和 square_size(宽度或高度)作为参数,然后将图像分成一系列所述大小的较小正方形。我不明白 PIL 的裁剪方法。它接受一个(上、左、右、下)。左上、右上等系统似乎更有用。

我在哪里,卡住的是编写代码,可以找到这些坐标应该是什么,从原点开始,给定一个正方形大小。有什么想法吗?

这是行不通的。

def parse_image(source, square_size):
    src = Image.open(source)
    dimensions = src.size
    max_up = int(src.height/square_size)
    max_right = int(src.width/square_size)

    tl = 0
    tr = square_size
    bl = square_size * src.width + 1 
    br = bl + square_size

    test = src.crop((tl,tr,bl,br))
    test.save('test.jpg')
    test.show()


【问题讨论】:

    标签: python python-imaging-library


    【解决方案1】:

    假设square_size 是一个定义每边长度的int,因此我们需要多个图像。 下面的代码未经测试,但应该可以解决您的问题

    def parse_image(source, square_size): 
        src = Image.open(source)
        width, height = src.size
        image_results = []
        for x in range(0, width, square_size): #
            for y in range(0, height, square_size):
                top_left = (x, y) #left top of the rect
                bottom_right = (x+square_size, y+square_size) #right bottom of the rect
                #the current format is used, because it's the cheapest
                #way to explain a rectange, lookup Rects
                test = src.crop((top_left[1], top_left[0], bottom_right[0], bottom_right[1]))
                image_results.append(test)
    
        return image_results
    

    如果有任何问题,请告诉我!

    编辑,我受到了一个候选答案的启发,这个解决方案奏效了。

    def parse_image(source, square_size, print_coords=False):
        src = Image.open(source)
        dimensions = src.size
        print(f"image dimensions: {src.size}")
        max_down = int(src.height/square_size) * square_size + square_size
        max_right = int(src.width/square_size) * square_size + square_size
    
        tl_x = 0
        tl_y = 0
        br_x = square_size 
        br_y = square_size
    
        count=0
        for y in range(square_size,max_down,square_size):
            for x in range(square_size,max_right,square_size):
                count +=1
                sample = src.crop((tl_x,tl_y,br_x,br_y))
                sample.save(f"{source[:-4]}_sample_{count}_x{tl_x}_y{tl_y}.jpg")
                if print_coords == True: 
                    print(f"image {count}: top-left (x,y): {(tl_x,tl_y)}, bottom-right (x,y): {(br_x,br_y)}")
                tl_x = x
                br_x = x + square_size
            tl_x =0
            br_x = square_size
            tl_y = y
            br_y = y + square_size
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2016-12-26
      • 2016-06-14
      • 1970-01-01
      相关资源
      最近更新 更多