`
mwxx
  • 浏览: 12188 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

libGDX图片磨砂玻璃效果

阅读更多
import com.badlogic.gdx.graphics.Pixmap;

public class Blur {

	public static void blurImage(int radius, Pixmap pixmap, int width,
			int height, int rectx, int recty, int rectw, int recth) {
		int w = pixmap.getWidth();
		int h = pixmap.getHeight();

		int xoffset = 0;
		int yoffset = 0;

		if (width > w) {
			width = w;
		}
		if (height > h) {
			height = h;
		}

		w = width;
		h = height;

		if (rectx > width) {
			rectx = 0;
		}
		if (recty > height) {
			recty = 0;
		}

		if (rectx + rectw > width) {
			rectw = width - rectx;
		}
		if (recty + recth > height) {
			recth = height - recty;
		}

		xoffset = rectx;
		yoffset = recty;

		w = rectw;
		h = recth;
		// mwxx red border around
		//pixmap.setColor(1, 0, 0, 1);
		pixmap.drawRectangle(xoffset, yoffset, w, h);

		int wm = w - 1;
		int hm = h - 1;
		int wh = w * h;
		int div = radius + radius + 1;

		int r[] = new int[wh];
		int g[] = new int[wh];
		int b[] = new int[wh];
		int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
		int vmin[] = new int[(int) Math.max(w, h)];

		int divsum = (div + 1) >> 1;
		divsum *= divsum;
		int dv[] = new int[256 * divsum];
		for (i = 0; i < 256 * divsum; i++) {
			dv[i] = (i / divsum);
		}

		yw = yi = 0;

		int[][] stack = new int[div][3];
		int stackpointer;
		int stackstart;
		int[] sir;
		int rbs;
		int r1 = radius + 1;
		int routsum, goutsum, boutsum;
		int rinsum, ginsum, binsum;

		for (y = 0; y < h; y++) {
			rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
			for (i = -radius; i <= radius; i++) {

				int index = yi + Math.min(wm, (int) Math.max(i, 0));

				int yy = (int) (index / w);
				int xx = (int) (index % h);

				// 32-bit RGBA8888
				p = pixmap.getPixel(xx + xoffset, yy + yoffset);

				int mask = p & 0xFFFFFFFF;
				int rr = (mask >> 24) & 0xff;
				int gg = (mask >> 16) & 0xff;
				int bb = (mask >> 8) & 0xff;

				sir = stack[i + radius];

				sir[0] = rr;
				sir[1] = gg;
				sir[2] = bb;

				rbs = r1 - (int) Math.abs(i);
				rsum += sir[0] * rbs;
				gsum += sir[1] * rbs;
				bsum += sir[2] * rbs;
				if (i > 0) {
					rinsum += sir[0];
					ginsum += sir[1];
					binsum += sir[2];
				} else {
					routsum += sir[0];
					goutsum += sir[1];
					boutsum += sir[2];
				}
			}
			stackpointer = radius;

			for (x = 0; x < w; x++) {

				r[yi] = dv[rsum];
				g[yi] = dv[gsum];
				b[yi] = dv[bsum];

				rsum -= routsum;
				gsum -= goutsum;
				bsum -= boutsum;

				stackstart = stackpointer - radius + div;
				sir = stack[stackstart % div];

				routsum -= sir[0];
				goutsum -= sir[1];
				boutsum -= sir[2];

				if (y == 0) {
					vmin[x] = Math.min(x + radius + 1, wm);
				}
				int index = yw + vmin[x];

				int yy = (int) (index / w);
				int xx = (int) (index % h);

				// 32-bit RGBA8888
				p = pixmap.getPixel(xx + xoffset, yy + yoffset);

				int mask = p & 0xFFFFFFFF;
				int rr = (mask >> 24) & 0xff;
				int gg = (mask >> 16) & 0xff;
				int bb = (mask >> 8) & 0xff;

				sir[0] = rr;
				sir[1] = gg;
				sir[2] = bb;

				rinsum += sir[0];
				ginsum += sir[1];
				binsum += sir[2];

				rsum += rinsum;
				gsum += ginsum;
				bsum += binsum;

				stackpointer = (stackpointer + 1) % div;
				sir = stack[(stackpointer) % div];

				routsum += sir[0];
				goutsum += sir[1];
				boutsum += sir[2];

				rinsum -= sir[0];
				ginsum -= sir[1];
				binsum -= sir[2];

				yi++;
			}
			yw += w;
		}
		for (x = 0; x < w; x++) {
			rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
			yp = -radius * w;
			for (i = -radius; i <= radius; i++) {
				yi = (int) Math.max(0, yp) + x;

				sir = stack[i + radius];

				sir[0] = r[yi];
				sir[1] = g[yi];
				sir[2] = b[yi];

				rbs = r1 - (int) Math.abs(i);

				rsum += r[yi] * rbs;
				gsum += g[yi] * rbs;
				bsum += b[yi] * rbs;

				if (i > 0) {
					rinsum += sir[0];
					ginsum += sir[1];
					binsum += sir[2];
				} else {
					routsum += sir[0];
					goutsum += sir[1];
					boutsum += sir[2];
				}

				if (i < hm) {
					yp += w;
				}
			}
			yi = x;
			stackpointer = radius;
			for (y = 0; y < h; y++) {
				int rr = dv[rsum];
				int gg = dv[gsum];
				int bb = dv[bsum];

				pixmap.setColor(rr / 255f, gg / 255f, bb / 255f, 1f);

				int yy = (int) (yi / w);
				int xx = (int) (yi % h);
				pixmap.drawPixel(xx + xoffset, yy + yoffset);

				rsum -= routsum;
				gsum -= goutsum;
				bsum -= boutsum;

				stackstart = stackpointer - radius + div;
				sir = stack[stackstart % div];

				routsum -= sir[0];
				goutsum -= sir[1];
				boutsum -= sir[2];

				if (x == 0) {
					vmin[y] = Math.min(y + r1, hm) * w;
				}
				p = x + vmin[y];

				sir[0] = r[p];
				sir[1] = g[p];
				sir[2] = b[p];

				rinsum += sir[0];
				ginsum += sir[1];
				binsum += sir[2];

				rsum += rinsum;
				gsum += ginsum;
				bsum += binsum;

				stackpointer = (stackpointer + 1) % div;
				sir = stack[stackpointer];

				routsum += sir[0];
				goutsum += sir[1];
				boutsum += sir[2];

				rinsum -= sir[0];
				ginsum -= sir[1];
				binsum -= sir[2];

				yi += w;
			}
		}
	}
}

 

分享到:
评论

相关推荐

    Libgdx实现动画效果示例

    Libgdx实现了动画效果,项目含:源码+效果图+APK 教程地址:http://blog.csdn.net/yangyu20121224/article/details/9208095

    Libgdx异步加载图片到本地

    在标题"Libgdx异步加载图片到本地"中,主要涉及到的技术点是异步加载和图片的本地存储。 异步加载是一种优化性能的方法,它允许应用程序在后台线程中执行耗时操作,如下载或解压缩资源,而不阻塞主线程。在Libgdx中...

    libgdx 图片翻转

    libGDX 提供了一系列丰富的图形处理工具,其中就包括图片翻转功能。本篇文章将深入探讨如何在 libGDX 中实现图片的翻转操作,以及涉及到的相关知识点。 在 libGDX 中,我们通常使用 `Texture` 对象来加载和管理图像...

    libgdx 粒子编辑器

    而“libgdx 粒子编辑器”则是LibGDX框架中用于创建和编辑粒子效果的工具。粒子系统在游戏开发中广泛应用于火焰、烟雾、水波、光效等视觉特效的制作,为游戏增添生动性和视觉吸引力。 粒子编辑器允许开发者无需编写...

    Libgdx利用Assetmanager实现图片加密

    在这个“Libgdx利用Assetmanager实现图片加密”的实例中,开发者已经实现了对图片的加密算法和解密工具。这是为了防止未经授权的访问者直接查看或复制游戏中的图片资源。加密过程通常涉及到将原始图片数据转换为难以...

    libGDX 1.10.0 开发包

    LibGDX将其集成到了框架中,使得开发者可以轻松地创建具有真实物理效果的游戏世界。Box2D提供了一个简单的API,允许创建不同形状的物体,设置物理属性,并进行碰撞检测和响应。 在使用这些组件进行游戏开发时,你...

    LibGDX Game Development Essentials

    本书“LibGDX Game Development Essentials”致力于为读者提供LibGDX游戏开发框架的核心知识,引导读者了解并掌握如何使用LibGDX来制作游戏。LibGDX是一个开放源码的Java游戏开发框架,它为游戏开发者提供了跨平台...

    libgdx游戏

    **LibGDX游戏开发详解** LibGDX是一个强大的开源Java框架,专为跨平台2D和3D游戏开发设计。这个框架允许开发者使用单一代码库创建游戏,可以在Android、iOS、Windows、Mac OS X和Linux等多个平台上运行。"libgdx...

    Libgdx开发丛书之 Learning LibGDX Game Development, 2nd Edition

    《Libgdx开发丛书之 Learning LibGDX Game Development, 2nd Edition》是一本专为游戏开发者准备的图书,旨在帮助读者深入理解并熟练运用LibGDX这一强大的跨平台游戏开发框架。LibGDX是一个开源的Java库,支持在...

    libgdx——游戏音效

    LibGDX是一个强大的开源Java框架,专为跨平台2D和3D游戏开发设计。它提供了丰富的功能,包括图形渲染、输入处理、物理模拟以及我们关注的“游戏音效”部分。在LibGDX中,处理音频是非常直观且高效的,这使得开发者...

    LibGDX音频案例素材.zip

    LibGDX的`Sound`接口则用于处理短促的一次性音频效果。和`Music`类似,可以通过`play()`播放,`pause()`和`stop()`控制,但`Sound`还支持通过`play(float volume, float pitch, float pan)`方法设置音量、音调和立体...

    libGDX粒子编辑器汉化版.rar

    在这个"libGDX粒子编辑器汉化版.rar"压缩包中,包含了一个特别为libGDX优化的粒子效果编辑器。粒子系统在游戏开发中广泛用于创建各种视觉特效,如爆炸、火花、烟雾、水流等。原生的libGDX粒子编辑器可能对中文用户来...

    libgdx教程

    LibGDX是一个强大的开源游戏开发框架,专为创建跨平台的游戏而设计。它支持Windows、Linux、MacOS、Android以及HTML5,使得开发者能够用Java语言编写一次代码,即可在多个平台上运行。这个“libgdx教程”显然是由...

    libgdx1.6.1.rar

    5. **物理引擎**:通过Box2D集成,LibGDX提供了物理模拟功能,让开发者可以创建真实感的物理效果,如碰撞检测和物体运动。 6. **场景管理**:Scene2D提供了一套易于使用的2D场景管理工具,包含演员(Actor)、舞台...

    Libgdx专题系列 斜45°地图

    通过深入学习和实践,开发者可以利用LibGDX创造出具有丰富视觉效果和互动性的2D游戏世界。提供的文件“LibgdxText_3”可能是这个专题系列的源代码或文档,可以帮助进一步理解和实现斜45°地图的细节。

    LibGDX Lua Tutorial工程

    - `assets`目录:存储游戏资源,如图片、音频、Lua脚本等。 - `build.gradle`文件:定义项目的构建设置和依赖。 6. **学习路径**: 对于初学者,首先需要熟悉LibGDX的基本用法,包括设置项目、渲染图形、处理...

    libgdx引擎开发的游戏 demo gif图

    标题提到的“libgdx引擎开发的游戏 demo gif图”很可能是指使用LibGDX引擎开发的一个游戏示例,该示例通过GIF动态图展示了游戏运行的效果。 在描述中,提供了一个代码下载链接,可以从CSDN(China Software ...

    libgdx Music 音乐播放

    LibGDX 是一个开源的游戏开发框架,用于创建跨平台的游戏...开发者可以根据游戏需求,灵活运用这些功能来实现丰富的音乐效果。在实际项目中,结合`AssetManager`进行资源管理,能更好地优化内存使用,提高游戏性能。

    libgdx引擎开发的游戏

    Texture则存储了图像数据,可以是单个图片或者多个图片组成的动画帧。 2. **ShapeRenderer**: 在Cuboc中,除了使用纹理绘制游戏元素,还使用了ShapeRenderer来绘制几何形状,如矩形、圆形等,用于创建简单的UI元素...

Global site tag (gtag.js) - Google Analytics