python图片裁剪_使用Python进行图像裁剪

我快速浏览了一下并解决了其他一些问题.基本上我的更改是这样做的:

>在临时图像上绘制边界框,设置其Alpha透明度,然后在主图像顶部进行blit.

>避免无关的绘图周期(当鼠标不移动时,再次绘制相同的图像没有意义).

>确保宽度和高度始终为正.如果通过向左或向上拖动鼠标来绘制矩形,则代码最终将显示负宽度和/或高度,从而在尝试编写最终图像时引发异常.

以下是运行固定代码的屏幕截图:

我将代码分成两部分以避免滚动条:

import pygame, sys

from PIL import Image

pygame.init()

def displayImage(screen, px, topleft, prior):

# ensure that the rect always has positive width, height

x, y = topleft

width = pygame.mouse.get_pos()[0] - topleft[0]

height = pygame.mouse.get_pos()[1] - topleft[1]

if width < 0:

x += width

width = abs(width)

if height < 0:

y += height

height = abs(height)

# eliminate redundant drawing cycles (when mouse isn't moving)

current = x, y, width, height

if not (width and height):

return current

if current == prior:

return current

# draw transparent box and blit it onto canvas

screen.blit(px, px.get_rect())

im = pygame.Surface((width, height))

im.fill((128, 128, 128))

pygame.draw.rect(im, (32, 32, 32), im.get_rect(), 1)

im.set_alpha(128)

screen.blit(im, (x, y))

pygame.display.flip()

# return current box extents

return (x, y, width, height)

第2部分(连接到上面):

def setup(path):

px = pygame.image.load(path)

screen = pygame.display.set_mode( px.get_rect()[2:] )

screen.blit(px, px.get_rect())

pygame.display.flip()

return screen, px

def mainLoop(screen, px):

topleft = bottomright = prior = None

n=0

while n!=1:

for event in pygame.event.get():

if event.type == pygame.MOUSEBUTTONUP:

if not topleft:

topleft = event.pos

else:

bottomright = event.pos

n=1

if topleft:

prior = displayImage(screen, px, topleft, prior)

return ( topleft + bottomright )

if __name__ == "__main__":

input_loc = 'stack.png'

output_loc = 'out.png'

screen, px = setup(input_loc)

left, upper, right, lower = mainLoop(screen, px)

# ensure output rect always has positive width, height

if right < left:

left, right = right, left

if lower < upper:

lower, upper = upper, lower

im = Image.open(input_loc)

im = im.crop(( left, upper, right, lower))

pygame.display.quit()

im.save(output_loc)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值