最近在移动硬盘的角落中发现大学时代玩过的一个吞食鱼游戏,相信很多人都玩过。随意点进去之后,发现游戏程序的图片库中,有鱼图片和黑白的鱼模型图片

让我很是不解,于是baidu了一下,原来是蒙版图抠图的一种方法,索性就自己写了个程序试了试,还真管用,下面把我理解的原理和写的测试程序发出来共享学习。

如果用蒙版图方式把一条鱼从图片中抠出来,再合成到背景图片中,大概有如下几个步骤:

1、准备蒙版图,如下的黑白鱼图片,当然也可以是白黑图。此图的特点是图片中的鱼模型和需要抠的鱼形状一致。

2、把黑白图片数据取反,得到白黑图(图片像素数据位中,0是黑色1是白色,取反之后黑白对换)。

3、把白黑图与背景图做与,即白黑图&背景图(注意:1&color=color,0&color=0)得到的图片是中间一个黑色鱼模型,周围是背景图片

4、把黑白图(注意与白黑图的区别)与鱼的原始图片做与,即黑白图 &鱼图片,得到的是图片中间一条鱼,周围是黑色。一般为加快处理速度,这种图片可以提前生成。

5、把上面的有黑色鱼模型的背景图,周围是黑色的鱼图片,做或运算(注意:1 | color = 1,0 | color = color),这样得到的图片就是鱼加到背景图片中。

其实挺简单的,不过现在游戏平台都支持透明像素和图层,应该很少用这种合成方式了吧,这方面我还是不很了解。

下面是我写的测试程序,用到的图片我上传到csdn资源中,不需要积分:

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.util.Arrays;import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;public class Testimg extends JFrame{/*** @param args*/public static void main(String[] args) {Testimg t = new Testimg();}//6张黑白图private Image[] maskImage = new Image[6];//6张鱼图片private Image[] sourceImage = new Image[6];//背景图片private Image bgImage;private MediaTracker tracker;private PixelGrabber[] maskPg = new PixelGrabber[6];private PixelGrabber[] sourcePg = new PixelGrabber[6];private PixelGrabber bgPg;public Testimg(){try {tracker = new MediaTracker( this );//加载黑白图和鱼图片for (int i=1;i<=6;i++){sourceImage[i-1] = ImageIO.read(new File("D:/images/eat_cycle."+i+".jpg"));maskImage[i-1] = ImageIO.read(new File("D:/images/_eat_cycle."+i+".png"));tracker.addImage(sourceImage[i-1], 0);tracker.addImage(maskImage[i-1], 0);}//加载背景图片bgImage = ImageIO.read(new File("D:/images/mainbg.jpg"));tracker.addImage(bgImage, 0);tracker.waitForAll();int mw = maskImage[0].getWidth( this );int mh = maskImage[0].getHeight( this );int[][] mPixs = new int[6][ mw * mh ];int sw = sourceImage[0].getWidth( this );int sh = sourceImage[0].getHeight( this );int[][] sPixs = new int[6][ sw * sh ];int bw = bgImage.getWidth(this);int bh = bgImage.getHeight(this);int[] bPixs = new int[ bw * bh ]; //背景图片像素int[] _bPixs = new int[ bw * bh ]; //临时背景图片像素for (int i=0;i<6;i++){maskPg[i] = new PixelGrabber( maskImage[i], 0, 0, mw, mh, mPixs[i], 0, mw );sourcePg[i] = new PixelGrabber( sourceImage[i], 0, 0, sw, sh, sPixs[i], 0, sw );maskPg[i].grabPixels();sourcePg[i].grabPixels();}bgPg = new PixelGrabber( bgImage, 0, 0, bw, bh, bPixs, 0, bw );bgPg.grabPixels();Point p = new Point(200,240); //鱼图片在背景图片中的初始坐标JLabel label = new JLabel();setSize(bw,bh);add(label);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//下面的while循环开始把鱼放到背景中while(true){for (int t=0;t<6;t++){Thread.sleep(300);//每次鱼图片的初始x坐标减少10像素,感觉鱼在游动p.setLocation(p.x-10, p.y);//把原始背景图片像素复制到临时数组中//相当于重置背景图片的作用_bPixs = Arrays.copyOf(bPixs, bPixs.length);for (int i=0;i<mPixs[0].length;i++){//把鱼图片数据赋值到临时背景图片数据中//这里写的赋值语句一步到位,具体含义是这样的//1、~mPixs[t][i]这是把黑白图取反,得到的是白黑图。就是图片中间是一条黑色鱼,周围是白色。//2、(i/mw+p.y)*bw+(i%mw+p.x)这个是换算公式,根据白黑图的像素坐标i换算成背景图中以p.x p.y起始的相对位置坐标。//3、~mPixs[t][i] & _bPixs[(i/mw+p.y)*bw+(i%mw+p.x)]白黑图与背景图做&运算,得到的图片中间是黑色的鱼图形,周围是背景的图片。//4、| sPixs[t][i]最后一步与原始鱼图片做|运算,就把鱼加到背景中了。_bPixs[(i/mw+p.y)*bw+(i%mw+p.x)] = ~mPixs[t][i] & _bPixs[(i/mw+p.y)*bw+(i%mw+p.x)] | sPixs[t][i];}//用处理完的临时背景图片设置到labelbgImage = createImage( new MemoryImageSource( bw, bh, _bPixs, 0, bw) );label.setIcon(new Icon() {public void paintIcon(Component c, Graphics g, int x, int y) {g.drawImage( bgImage, 0, 0, null );}public int getIconWidth() {return bgImage.getWidth(null);}public int getIconHeight() {return bgImage.getHeight(null);}});}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

吞食鱼游戏蒙版图方法把鱼放到背景中相关推荐

  1. python获取类的所有方法、并存放到字典中_孤荷凌寒自学python第十二天python字典类的其它操作...

    今天继续对dict类进行研究 一.删除dict对象中的所有元素 dictname.clear() 此方法将删除dict对象中的全部元素,但字典对象本身还在. 二.关于建立dict的副本,即创建一个di ...

  2. 噔噔噔!千呼万唤云鱼游戏终于上线公测啦!

    3月31日,iFish云鱼游戏终于在万众瞩目之下开发者测试版开始公测啦!同时,已经上线运行超过两年的老牌大型区块链游戏社区品质大厦,品质金融等在官网宣布并入云鱼社区.立即下载k5钱包,进入游戏,参与公 ...

  3. html5抓鱼游戏,捉鱼幼儿园小班的游戏方案

    第1篇:捉鱼幼儿园小班的游戏方案 活动要求: 1.通过涂*."捉鱼"等活动,复习5以内的加减法. 2.激发幼儿学计算的兴趣,培养幼儿的活动能力. 活动准备: 1.用大积木围成的小鱼 ...

  4. HTML5“爱心鱼”游戏总结

    HTML5"爱心鱼"游戏总结 目录 1.页面搭建 2.画蓝色的海洋 3.画随海水摆动的漂浮物 4.画随海水摆动的海葵 5.画静态的大鱼和小鱼 6.鼠标控制大鱼的游向 7.给大鱼.小 ...

  5. 上班最强摸鱼游戏-多人联机小游戏 (一)

    highlight: a11y-dark 多人在线射击游戏.最强摸鱼游戏 在想体验地址====> github地址: 开发不易,多谢大哥大姐们点个start吧,点个小爱心吧 技术栈 canvas ...

  6. java大嘴鱼游戏代码_Java编写大嘴怪游戏--原创

    第一步:大嘴鱼类 package fish; import java.awt.Color; import java.awt.Graphics; import java.awt.event.Action ...

  7. 面向对象编程项目案例(栈与队列封装和乌龟吃鱼游戏)

    一.Pygame相关介绍 1.Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚.Pygame常用模块 2.一个游 ...

  8. 纸牌游戏设计制作《摸鱼2》(C语言)

    纸牌游戏设计制作<摸鱼2> 此游戏设计属于简单的纸牌游戏,是儿童益智类游戏.适用于儿童的认知教育. 游戏规则极为简单,设置纸牌在界面上显示牌背的盲牌形式,点击牌背显示牌面找出相同的牌配对消 ...

  9. Python 简单的龟鱼游戏

    游戏编程:按一下要求定义一个乌龟类和鱼类并尝试编程 假设游戏场景为范围(x,y)为 0<=x<=10,0<=y<=10 游戏生成1只乌龟和10条鱼 他们的移动方向均随机 乌龟的 ...

最新文章

  1. AndroidのUI设计研究(一)——自定义ProgressBar
  2. 【错误记录】Flutter / Android 报错 ( AAPT: error: attribute android:requestLegacyExternalStorage not found )
  3. PHP 遇见 Serverless,帮你解决这些痛点
  4. 集合数百个常用工具类集合,V2.3.10.104
  5. Extjs4 radiogroup打开时的被选中值设置为变量
  6. SAP CRM产品主数据明细页面无法打开的调试步骤
  7. java void方法_Java对象类的最终void wait(long ms)方法,包含示例
  8. linux镜像文件的rpm,REDHAT安装镜像里的RPM文件02
  9. Add-in and Automation Development In VB.NET 2003 (8)
  10. element UI表格使用cell-style改变单元格样式
  11. 由古书看,古人应该知道地球是圆的
  12. 【计算机组织与体系结构】实验三:流水线处理器
  13. BS版的U8物料查询系统
  14. Flutter时间轴
  15. 训练CV模型新思路来了:用NLP大火的Prompt替代微调,性能全面提升
  16. a boo peek_|音译|171120*歌词ΓRed Velvet - Peek-A-Boo
  17. 【软件定义汽车】【架构篇】最全整车电子电气E/E架构(含汽车公司)
  18. Python 字符串前加r,b,u
  19. 创业教父YC创始人Paul Graham就很烦鼓动年轻创业的
  20. 华为harmonyos 2.0,HarmonyOS2.0

热门文章

  1. php定界符格式输出变量,php定界符和几种输出方式
  2. 2020-11-16 css使用颜色渐变绘制梯形
  3. 一个完整的短视频包含哪些要素?做短视频还要学会把控全局
  4. html怎么看兼不兼容浏览器,六大双核浏览器HTML5兼容性测试
  5. matlab降压启动,基于 Matlab 的笼形异步电动机降压启动分析
  6. 最常用的十大管理工具 公司管理常用哪几种管理工具
  7. DataFrame操作excel文件及表格样式调整
  8. python语音识别whisper
  9. WebGL原来如此:搞懂三维坐标系变换
  10. 电子设计教程36:LC并联谐振滤波器