常用技巧(一):利用位运算去掉贴图空白部分

一、问题描述

在游戏开发的时候,特别是在2D游戏开发,我们经常会遇到这样一个问题,我们选用的是一张jpg/bmp图片,它不像png那样拥有透明的像素点。所以当我们把图片放到我们的屏幕的时候可能会出现如下问题:

我们的图片,我想把他贴到我们的背景上面

预期效果:

实际效果:

二、解决办法

1、首先我们先对图片素材做一点点的修改

我们需要两张图片:一张为原图,一张为屏蔽图

原图,注意这里我们不需要的部分必须为黑色

屏蔽图,只有黑白两色,需要的部分为黑色,不需要的部分为白色

2、将屏蔽图与背景图作位AND运算

屏蔽图只有黑白两色,我们分两种情况讨论:

1)屏蔽图的黑色(0X000000)AND  背景图颜色(随意) =  黑色(0X000000)

2)屏蔽图的白色(0XFFFFFF)AND  背景图颜色(随意) = 背景图颜色

得到的效果图如下:

3、将新得到的图片(暂时命名为新背景)与原图作位OR运算

原图也只有两种情况,一种是我们需要的部分(颜色随意),一种为我们不需要的部分(颜色为黑色)

1)需要的部分(随意) OR 新背景(黑色0X000000) =  需要的部分的颜色

2)不需要的部分(黑色0X000000)OR 新背景 = 新背景的颜色

得到的效果图如下:

三、总结

可以一下的步骤来去掉一张图片中我们不需要的空白部分:

1、把不需要的部分涂为黑色(原图)

2、准备一张屏蔽图

3、屏蔽图与背景图作位AND运算得到新背景图

4、新背景图与原图作OR运算得到最终效果。

最后附上手稿:

时间: 2024-08-27 07:08:19

常用技巧(一):利用位运算去掉贴图空白部分的相关文章

【C】辗转相除法求两个数的最大公约数,利用位运算交换两个数无须中间变量

辗转相除法,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法.它是已知最古老的算法, 其可追溯至3000年前.这种算法,在中国则可以追溯至东汉出现的<九章算术>.设两数为a.b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1).若r1=0,则(a,b)=b:若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除r2

利用位运算进行权限管理

原理 在Linux文件系统中,一个用户对文件或目录所拥有的权限分为三种:”可读”.”可写”和”可执行”,分别用 1 .2 和 4 来表示,它们之间可以任意组合:有“可读”.“可写”权限就用 3 来表示(1 + 2 = 3):有”可读“.”可执行“权限就用5来表示(1 + 4 = 5),三种权限全部拥有就用 7 表示(1 + 2 + 4 = 7). 实际上,这种运算是基于二进制的. 假设可执行.可写.可读三种权限分别对应三个状态位,如果用户具有某种权限,那么将对应的状态位标识为“1”,反之则标识为

c基础【一】利用位运算实现数字反转

#include <stdio.h> #include <stdlib.h> int main() { //通过位运算实现数字的反转(操作的对象必须是整数) unsigned int original =0x123; unsigned int result =0; unsigned int mask =0xF; //掩码 result |=original&mask; original>>=4; result<<=4; result |=origin

利用位运算简单实现加密运算

1 public static void main(String[] args){ 2 Scanner scanner = new Scanner(System.in); 3 System.out.println("please enter something:"); 4 String str = scanner.nextLine(); 5 char[] array = str.toCharArray(); //获取字符数组 6 for (int i = 0; i<array.l

位运算 使用技巧

位运算简介及实用技巧(一):基础篇 什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算.举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理): 110 AND 1011 ---------- 0010  -->  2 由于位运算

位运算简介及实用技巧(一):基础篇[转]

位运算简介及实用技巧(一):基础篇 原贴链接:http://www.matrix67.com/blog/archives/264 去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章.后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法.从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake.当然首先我还是从最基础的东西说起. 什么是位运算?    程序中的所有

(转)位运算简介及使用技巧

转自http://www.matrix67.com/blog/archives/263 去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章.后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法.从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake.当然首先我还是从最基础的东西说起. 什么是位运算?    程序中的所有数在计算机内存中都是以二进制的形式储存的.

位运算应用技巧

非常有用的位运算技巧 一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读<编程之美>求"1的数目"时,我才开始觉得位运算是如此之美,后来读到 <Hacker's Delight>,感慨到Henry S.Warren把位运算运用的如此神出鬼没,很多程序都十分精妙,我觉得在一个普通的程序中大量运用这样的代码的人简直是疯了!

位运算专题

首先抱来Matrix67大牛的文章(修改部分内容): 位运算简介及实用技巧(一):基础篇     去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章.后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法.从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake.当然首先我还是从最基础的东西说起. 什么是位运算?    程序中的所有数在计算机内存中都是以二进制的形