1

内置的 MacOS 屏幕捕获程序 (command-shift-4) 有一个很好的功能,您可以点击空格键并捕获一个窗口,如下所示:

在此处输入图像描述

我想以编程方式查看图像目录(它们是 PNG),确定它们是否有阴影,然后自动裁剪它。我需要它才能在 Mac 上运行。我想用 Python 写这个。有人告诉我Pillow是现在在 Python 中管理图像的正确方法,但我不确定如何读取单个像素和裁剪图像。

4

2 回答 2

0

下面是使用 Python Image Library 和 Python 2.7 来实现这一点的代码:

#!/usr/bin/env                                                                                                                       
# Removes the shadow from MacOS-Generated screen shots.                                                                              

import Image,os

if __name__=="__main__":
    image = Image.open(os.sys.argv[1])
    image = image.convert('RGBA')

    (width,height) = image.size
    def find_first_non_alpha_x():
        for i in range(width):
            if image.getpixel((i,height/2))[3]==255:
                return i
        raise RuntimeError("No non-alpha pixels on midline")

    def find_last_non_alpha_x():
        for i in range(width-1,0,-1):
            if image.getpixel((i,height/2))[3]==255:
                return i
        raise RuntimeError("No non-alpha pixels on midline")

    def find_first_non_alpha_y():
        for i in range(height):
            if image.getpixel((width/2,i))[3]==255:
                return i
        raise RuntimeError("No non-alpha pixels on midline")

    def find_last_non_alpha_y():
        for i in range(height-1,0,-1):
            if image.getpixel((width/2,i))[3]==255:
                return i
        raise RuntimeError("No non-alpha pixels on midline")

    x1 = find_first_non_alpha_x()
    y1 = find_first_non_alpha_y()
    x2  = find_last_non_alpha_x()
    y2  = find_last_non_alpha_y()

    y = image.crop((x1-1,y1-1,x2+1,y2+1))
    y.save(os.sys.argv[1]+"-cropped.png")
于 2013-09-30T20:25:40.640 回答
0

无论您将使用哪种库,这里都有一些建议。

窗口上有不变量:4 个角,标题栏颜色基本一致,3 个圆盘形按钮。

如果您可以检测到按钮和标题栏,则可以轻松找到顶角。底角与顶角对称。

一个可能的解决方案

  • 应用霍夫变换来寻找圆
  • 沿水平轴找到 3 个连续的圆圈(按钮)
  • 应用霍夫变换找到垂直和水平线
  • 找到一个包含 3 个圆圈的四边形(标题栏)
  • 窗口的两个顶角位于标题栏的顶角周围。
  • 通过拐角处的邻域形成一个补丁
  • 在补丁中应用边缘检测算法
  • 垂直反射补丁的像素
  • 垂直应用补丁匹配。以DP为例
  • 对 2 个顶角重复匹配以找到底角

通过 4 个角,您知道窗口的边界框,您可以解决裁剪问题

于 2013-08-17T22:05:57.670 回答