鱼C论坛

 找回密码
 立即注册
查看: 2466|回复: 6

[技术交流] 图片取色,涂抹代码

[复制链接]
发表于 2018-3-26 13:33:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 JAY饭 于 2018-3-26 18:12 编辑

注释已经更新:
  1. import pygame
  2. from pygame.locals import *
  3. import sys

  4. pygame.init()
  5. clock = pygame.time.Clock()  #帧数
  6. size = 751,864               #界面尺寸
  7. bg = 255,255,255             #背景白色

  8. img = '23.png'               #需要处理的图片
  9. mouse_img = '萌.jpg'         #鼠标在pygame界面的图标
  10. C,R,X = 2,0,0                #对应键盘操作的几个开关状态
  11. smear,tailor = False,False   #在对开启对应操作状态的情况下,决定是涂抹选区
  12.                              #或者矩形选区
  13. color = 0                    #初始颜色变量
  14. unit = 20                    #每一帧手动涂抹的单位面位
  15. rect_height,rect_width = 0,0  #矩形选区的起点变量初始赋值
  16. Rect_tail = pygame.Rect(0,0,0,0) #初始化一个矩形边框,后面变化的矩形选框都是这个

  17. def imgbackground(img):      #此函数返回surface对象及其位置和宽高
  18.     imgback = pygame.image.load(img).convert()
  19.     imgback_pos = imgback.get_rect()
  20.     return [imgback,imgback_pos]

  21. def get_pointcolor(imgsurface,x,y): #此函数返回选取点的色彩参数
  22.     return imgsurface.get_at((x,y))

  23. def set_imgcolor(imgsurface,getcolor,x,y,unit): #手动涂抹中,每一帧涂抹的范围
  24.     for i in range(x,x+unit):
  25.         for j in range(y,y+unit):
  26.             imgsurface.set_at((i,j),getcolor)

  27. def saveimg(img):         #将处理后的图片保存
  28.     pygame.image.save(img,'模板副本.png')


  29. def imgsmear(img,unit):   #当smear参数为真,将获取的颜色跟随鼠标位置移动涂抹
  30.     global color
  31.     if smear:
  32.         x,y = pygame.mouse.get_pos()
  33.         set_imgcolor(img,color,x,y,unit)

  34. def rect_tailor(img):    #此函数将矩形选区的所有色彩全部替换成color参数的颜色
  35.     global color,Rect_tail
  36.     for i in range(Rect_tail.left,Rect_tail.right):
  37.         for j in range(Rect_tail.top,Rect_tail.bottom):
  38.             img.set_at((i,j),color)

  39. def rect_draw(screen,mousex,mousey): #此函数在X参数为真的情况下,实时绘制矩形
  40.     global X,rect_width,rect_height  #这里需要注意的画布应该是screen而不是img
  41.     if X == 1:                       #否则会出现很多的矩形
  42.         Rect_tail.width,Rect_tail.height = mousex-rect_width,mousey-rect_height
  43.         pygame.draw.rect(screen,(0,0,0),Rect_tail,1)
  44.     elif X == 2:
  45.         pygame.draw.rect(screen,(0,0,0),Rect_tail,1)
  46.         
  47. def control(img,unit,mousex,mousey):  #决定键盘和鼠标的控制函数
  48.     global C,X,R,color,smear,tailor,Rect_tail,rect_width,rect_height
  49.     for event in pygame.event.get():
  50.         
  51.         if event.type == pygame.QUIT:  
  52.             sys.exit()
  53.             
  54.         elif event.type == KEYDOWN:  #当按G键,开启或者关闭C,同时关闭R
  55.             if event.key == K_g:     #意思是不能同时开启两个手动和矩形两个模式
  56.                 C,R = not C,False
  57.             elif event.key == K_a:   #A键保存图片
  58.                 saveimg(img)
  59.             elif event.key == K_r:   #当按G键,开启或者关闭R,同时关闭C
  60.                 R,C = not R,False   
  61.                
  62.         elif event.type == MOUSEBUTTONDOWN: #当检测鼠标左键按下
  63.             if event.button == 1:           
  64.                 if C:                   #如果是非涂抹模式,取色
  65.                     color = get_pointcolor(img,mousex,mousey)
  66.                 elif not C and not R:   smear = True  #如果是涂抹模式,手动
  67.                 elif R:           #当选区换色打开
  68.                     if not X:     #如果是还没开始选区,则初始矩形位置于第一次鼠标位置
  69.                         rect_width,rect_height = mousex,mousey
  70.                         Rect_tail.left,Rect_tail.top = mousex,mousey
  71.                         X = 1
  72.                     elif X == 2:  #如果已经选好区,并且点击区域范围,执行换色
  73.                         if Rect_tail.left<mousex<Rect_tail.right\
  74.                            and Rect_tail.top<mousey<Rect_tail.bottom:
  75.                             rect_tailor(img)
  76.                         X = 0    #完成动作后,初始X,等待下调用
  77.                                             
  78.         elif event.type == MOUSEBUTTONUP: #当检测鼠标弹起,所有动作停止
  79.             smear = False
  80.             if X == 1: X = 2   
  81.             
  82. def main(size,bg,img,mouse_img,unit):   #主程序循环
  83.     screen = pygame.display.set_mode(size,RESIZABLE)
  84.     [img,pos] = imgbackground(img)
  85.     [mouse_img,mouse_pos] = imgbackground(mouse_img) #设置新鼠标图标
  86.     pygame.mouse.set_visible(False)    #设置原鼠标不可见
  87.     while True:
  88.         screen.fill(bg)     #背景
  89.         screen.blit(img,pos)  #需要处理的图片
  90.         temp = pygame.mouse.get_pos()  #获取当前鼠标位置
  91.         mouse_pos.left,mouse_pos.top = temp[0],temp[1]
  92.         control(img,unit,temp[0],temp[1])  #接收触发动作的事件
  93.         imgsmear(img,unit)               #是否涂抹
  94.         rect_draw(screen,temp[0],temp[1]) #是否画矩形
  95.         screen.blit(mouse_img,mouse_pos)  #画鼠标
  96.         pygame.display.flip()          #双缓冲刷新图像
  97.         clock.tick(40)              #帧数
  98.         

  99. if __name__ == '__main__':
  100.     main(size,bg,img,mouse_img,unit)
  101.         
复制代码

评分

参与人数 1荣誉 +10 鱼币 +10 贡献 +10 收起 理由
alltolove + 10 + 10 + 10 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-26 13:48:07 | 显示全部楼层
本帖最后由 alltolove 于 2018-3-26 14:00 编辑

这是什么原理啊?

23.png和萌.jpg这两张图呢?
你 import numpy 也没用上啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-26 16:05:32 From FishC Mobile | 显示全部楼层
抱歉,很仓促,是发给别人看的,没来的及改。图片可以改任意图片,之前用image模块改变透明度,用的numpy,后来写着写着又感觉不需要用image模块
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-26 16:12:38 From FishC Mobile | 显示全部楼层
alltolove 发表于 2018-3-26 13:48
这是什么原理啊?

23.png和萌.jpg这两张图呢?

这个原理比较简单,取色用的是surface对象的get_at获取坐标颜色。然后通过set_at方法涂抹颜色,其中用的两个方法,第一个是取色后,手动涂抹,让涂抹区域跟随鼠标移动,第二个方法是拉线用方框矩形选定区域,然后点击区域里面,就可以换色,操作方式上我写的有点乱,一进去界面点击任意区域就是选色,按g键手动涂抹,再按g关闭手动,按R打开方框选区涂抹,再按R恢复手动涂抹,想取色就按g切换,用来说,很不人性化,比较随意,因为是自己写着用来编辑好的模板图案的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-26 16:13:47 From FishC Mobile | 显示全部楼层
按a保存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-26 16:18:30 From FishC Mobile | 显示全部楼层
对了萌.png是用来替代界面里的鼠标图案,尽量选20*20 的图片替代
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-26 17:12:43 | 显示全部楼层
本帖最后由 JAY饭 于 2018-3-26 17:37 编辑

11
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 15:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表