游戏开发中,图片资源的精简

在游戏开发中,包的大小总是与图片资源的大小密切相关,而图片资源中,大多为带有透明度信息的png图像。

那么,如何精简png图片资源呢?

1、图像压缩是一种方法,然而随着压缩率的增大、图片品质也越来越差。(舍弃)

2、我们另辟蹊径,采用png图像拆分。(近乎无损,资源精简)

一、原理:将png图像转化为两张jpeg图像进行存储

pngSplit下载

pngSplit使用说明

二、使用方法:

1、LibGdx中,通过Pixmap使用

// 如工程目录assets/texture/0_1.jpeg下:
/** 从工程资源路径下获取图像,如:filePath1 = "texture/0_1.jpeg"、filePath2 = "texture/0_2.jpeg" */
public static Texture getTexture(String filePath1, String filePath2)
{
	try
	{
		Pixmap pic1 = new Pixmap(Gdx.files.internal(filePath1));
		Pixmap pic2 = new Pixmap(Gdx.files.internal(filePath2));

		Pixmap pic = Combine(pic1, pic2);	// 合并为png图像
		return new Texture(pic);			// 创建Texture
	}
	catch (Exception ex)
	{
		return null;
	}
}

/** 从Pic和Mask合成图像 */
public static Pixmap Combine(Pixmap Pic, Pixmap Mask)
{
	int width = Pic.getWidth(), height = Pic.getHeight();	// 获取图像的尺寸

	Pixmap image = new Pixmap(closestTwoPower(width), closestTwoPower(height), Format.RGBA8888);	// 合成尺寸为2的幂

	int color1, color2, color, alpha;
	for (int i = 0; i < width; i++)
	{
		for (int j = 0; j < height; j++)
		{
			color1 = Pic.getPixel(i, j);	// 原图像像素信息
			color2 = Mask.getPixel(i, j);	// 原图像透明度信息

			alpha = (color2 & 0xff00) >> 8;							// 透明度
			color = alpha == 0 ? 0 : (color1 & 0xffffff00) | alpha;	// 合成像素点

			image.drawPixel(i, j, color);	// 生成图像
		}
	}
	return image;
}

/** 获取最接近于n的2的幂 */
public static int closestTwoPower(int n)
{
	int power = 1;
	while (power < n)
		power <<= 1;
	return power;
}

2、安卓中,通过Bitmap使用(未调试)

/** 从工程资源路径下获取图像,如:filePath1 = "0_1.jpeg"、filePath2 = "0_2.jpeg" */
public static Bitmap getBitmap(String pathName1, String pathName2)
{
	try
	{
		Bitmap pic1 = BitmapFactory.decodeFile(pathName1);
		Bitmap pic2 = BitmapFactory.decodeFile(pathName2);

		Bitmap pic = Combine(pic1, pic2);	// 合并为png图像
		return pic;
	}
	catch (Exception ex)
	{
		return null;
	}
}

/** 从Pic和Mask创建bitmap图像 */
public static Bitmap Combine(Bitmap Pic, Bitmap Mask)
{
	int width = Pic.getWidth(), height = Pic.getHeight(); // 获取图像的尺寸
	Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

	int color1, color2, color;
	for (int i = 0; i < width; i++)
	{
		for (int j = 0; j < height; j++)
		{
			color1 = Pic.getPixel(i, j); // 原图像像素信息
			color2 = Pic.getPixel(i, j); // 原图像透明度信息
			color = (color1 & 0x00ffffff) | ((color2 & 0x00ff0000) << 8); // 合成像素点

			image.setPixel(i, j, color); // 生成图像
		}
	}
	return image;
}

时间: 2024-10-20 05:14:28

游戏开发中,图片资源的精简的相关文章

游戏开发中的人工智能 复习

游戏开发中的人工智能 复习 (个人复习,一些仅是给自己的复习提示(=w=),转载注明出处:http://blog.csdn.net/hcbbt/article/details/42815479) 配套教材:游戏开发中的人工智能 知识点 移动 Bresenham,视线(略),拦截 // Bresenham if (deltaCol > deltaRow) { fraction = deltaRow * 2 - deltaCol; while (nextCol != endCol) { if (fr

&lt;游戏开发中的人工智能&gt; -- 阅读笔记

到家已经几天了, 休息了一阵, 是时候重新学习知识了. 接下去一段时间, 会啃<游戏开发中的人工智能>这本书, 顺便写写笔记. 马上就大三了, 想想自己选的游戏方向, 现在还蛋疼. 选了一个自己喜欢的方向, 但是确实最忙的一个,这也意味着少时间继续我的iOS学习. 也不知道是对是错. 既然选了,就学吧. 好不,不扯多了.接下去是该系列的笔记.(持续更新) 第一章: 游戏人工智能简介 1. 定性AI与非定性AI 定性行为或其表现是特定的,而且是可预测的,没有不确定性. 非定性行为有某种程度的不确

游戏开发中的一些基本方法

一.              检测对象变化的两种基本方式: 学过<微机原理>的人应该都了解这两种方式 1.       轮询 1) 每帧轮询 2) 定时轮询 按业务需求和性能问题选择 2.       中断(并非硬件中断,而是软件的事件通知方式) 两种模式: 1)       观察者模式 优点:① 扩展性强,事件发起接口不变,只需增加事件类型 ② 只通知对某件事有兴趣的对象,不会浪费性能 ③ 每种事件对应一种回调函数,对于回调函数,事件参数类型是固定的,MouseMove事件的参数类型肯定是

c++实现游戏开发中常用的对象池(含源码)

c++实现游戏开发中常用的对象池(含源码) little_stupid_child2017-01-06上传 对象池的五要素: 1.对象集合 2.未使用对象索引集合 3.已使用对象索引集合 4.当前使用量 5.最大使用量 http://download.csdn.net/download/little_stupid_child/9730912

Cocos2d-x手机游戏开发中-组合动作

动作往往不是单一,而是复杂的组合.我们可以按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作.组合动作包括以下几类:顺序.并列.有限次数重复.无限次数重复.反动作和动画.动画我们会在下一节介绍,本节我们重点顺序.并列.有限次数重复.无限次数重复和反动 下面我们通过一个实例介绍一下组合动作的使用,这个实例如下图所示,下图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的动作效果,点击Back按钮可以返回到菜单场景. 下面我们再看看具体的程序

游戏开发中的矩阵初探

游戏开发中的矩阵初探 1.矩阵在3d空间中的作用 (1)长方体A想绕(10,3,4)旋转50°且沿着x方向放大2倍且向(9,-1,8)方向平移2个单位,那么经过上面的变换后,新的长方体各个点的坐标是多少呢?应用矩阵可以很轻松的算出答案. (2)知道子坐标系在父坐标系中的位置,可以求出子坐标系中的店在父坐标系中的位置. 2.矩阵的基础知识 矩阵能描述任意线性变换.线性变换保留了直线和平行线,线性变换保留直线的同时,其他的几何性质如长度.角度.面积和体积可能被变换改变了.简单的说,线性变换可能“拉伸

[C++基础]位运算 游戏开发中的应用

位运算的定义:通俗点说,位运算就是对一个整数在计算机中二进制进行操作. 任何一个整数都可以用二进度的方式来表示的,不同类型的整数它的位数的长度也不一样,INT8或者char是由8个2进度 位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示. 位运算在游戏中的应用 往往,在游戏开发中做位运算的时候,我关注的主要是某一位的值是0,还是1,而并不是去关注这个整数的值是多少. 比如:00100010,这个8位的整数从右到左,它的第一位为0,第二位为1,第三位为0,第六

游戏开发中可能用到的【6个等级】

游戏开发中可能用到的[6个等级] 男爵.子爵.伯爵.侯爵.公爵.亲王 车神.车王.车侠.车迷.车夫.车屌(可以别的字眼替换如"赌"替换掉"车") 迷梦.觉醒.追影.怀旧.失忆.成才 皇帝.皇后.宰相.将军.宫女.太监 砖家.学神.学霸.学弱.学渣.文盲 土豪.员外.富农.贫农.长工.短工 皇帝.皇后.贵妃.常在.答应.宫女 土炮.铁炮.钢炮.银炮.金炮.神炮 呦喂.我去.花擦.次奥.尼玛.我日 路人.朋友.好友.挚友.兄弟.老铁 脑残.白痴.逗比.傻瓜.凡人.天才

HTML5游戏开发中基础的Tag讲解

一般在HTML5游戏开发中,基础的Tag都用在标题,段落以及分行上,下面就来讲解下几种最常用的Tag.当然最好用的HTML5学习方式就是跟随示例,今天我们的HTML5游戏开发教程也从实例开始. 首先来看一下标题中的Tag应用.在HTML5游戏开发中,我们用从h1至h6的几个Tag来定义文章的标题,每个正文中的标题都是自成一段的.例如这样: <html>  <head></head>  <body>   <h1>This is a heading&