Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 复制一个像素区域_Python_Pygame - Fatal编程技术网

Python 复制一个像素区域

Python 复制一个像素区域,python,pygame,Python,Pygame,我正在使用Python和pygame制作一个简单的绘图应用程序 我需要一种方法从一个区域复制像素(例如,从x100,y100到x200,y200),保存它,然后再次将其放下来。很像截图 也许是表面 我不知道表面是如何工作的,甚至不清楚它们是做什么的。你可以用它来创建一个地下结构 这里有一个简单的例子。用鼠标选择一个区域,然后再次按下鼠标按钮,以闪烁选定的次表面: import pygame pygame.init() screen = pygame.display.set_mode((800,

我正在使用Python和pygame制作一个简单的绘图应用程序

我需要一种方法从一个区域复制像素(例如,从x100,y100到x200,y200),保存它,然后再次将其放下来。很像截图

也许是表面

我不知道表面是如何工作的,甚至不清楚它们是做什么的。

你可以用它来创建一个地下结构

这里有一个简单的例子。用鼠标选择一个区域,然后再次按下鼠标按钮,以闪烁选定的次表面:

import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))

clock = pygame.time.Clock()
for x in xrange(0, 800):
    pygame.draw.rect(screen, ((x+100)%255, (x*2)%255, x%255), pygame.Rect(x, 0, 1, 800))

org_screen = screen.copy()

class Cursor(object):
    def __init__(self):
        self._inner = CopyCursor()

    def mousedown(self, mpos):
        self._inner = self._inner.mousedown(mpos)

    def mouseup(self, mpos):
        self._inner = self._inner.mouseup(mpos)

    def draw(self, screen, mpos):
        self._inner.draw(screen, mpos)

class CopyCursor(object):
    def __init__(self):
        self.start, self.end = None, None

    def mousedown(self, mpos):
        self.start = mpos
        return self

    def mouseup(self, mpos):
        if self.start and self.end:
            r = pygame.Rect(self.start, self.end)
            r.normalize()
            # important to call .copy() so 'sub_surf' 
            # loses its relation to 'screen'
            return BlitCursor(screen.subsurface(r).copy())
        return self

    def draw(self, screen, mpos):
        if self.start:
            self.end = mpos[0]-self.start[0], mpos[1]-self.start[1]
            rect = pygame.Rect(self.start, self.end)
            pygame.draw.rect(screen, pygame.Color('grey'), rect, 3)

class BlitCursor(object):
    def __init__(self, sub_surf):
        self.sub_surf = sub_surf

    def mousedown(self, mpos):
        pygame.event.post(pygame.event.Event(pygame.USEREVENT, surface=self.sub_surf, pos=mpos))
        return CopyCursor()

    def mouseup(self, mpos):
        pass

    def draw(self, screen, mpos):
        screen.blit(self.sub_surf, mpos)

cursor = Cursor()
while True:
    mpos = pygame.mouse.get_pos()
    for e in pygame.event.get():
        if e.type == pygame.QUIT: break
        if e.type == pygame.MOUSEBUTTONUP: cursor.mouseup(mpos)
        if e.type == pygame.MOUSEBUTTONDOWN: cursor.mousedown(mpos)
        if e.type == pygame.USEREVENT:
            org_screen.blit(e.surface, e.pos)
            screen.blit(org_screen, (0, 0))
    else:
        if not pygame.event.peek(pygame.USEREVENT):
            cursor.draw(screen, mpos)            
            pygame.display.flip()
            screen.blit(org_screen, (0, 0))
        clock.tick(50)
        continue
    break


另一种方法是使用
区域
关键字,同时只对源
表面的特定区域进行blit


第三种方法是使用,但这相当麻烦。

+martineau我很困惑,但谢谢你这么粗鲁,因为这有助于你可以用write制作屏幕截图,如果你想的话,我可以回答,但如果你不想的话,请指定你想要的。这很酷,但我用两行代码XD解决了这个问题