`
univasity
  • 浏览: 813559 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[整理]收集的几个J2ME图像缩放函数

    博客分类:
  • J2me
J# 
阅读更多

收集了一下图像缩放的函数,可能实现的方式很多,感觉这几个不错的,分享下

 

说明:以下函数都是基于MIDP2.0的,缩放后保留透明色。

 

public static Image resizeImage(Image src, int destW, int destH) {
		int srcW = src.getWidth();
		int srcH = src.getHeight();

		// create pixel arrays
		int[] destPixels = new int[destW * destH]; // array to hold destination
		// pixels

		int[] srcPixels = new int[srcW * srcH]; // array with source's pixels
		src.getRGB(srcPixels, 0, srcW, 0, 0, srcW, srcH);

		// simple point smapled resizing
		// loop through the destination pixels, find the matching pixel on
		// the source and use that
		for (int destY = 0; destY < destH; ++destY) {
			for (int destX = 0; destX < destW; ++destX) {
				int srcX = (destX * srcW) / destW;
				int srcY = (destY * srcH) / destH;
				destPixels[destX + destY * destW] = srcPixels[srcX + srcY
						* srcW];
			}
		}

		// return a new image created from the destination pixel buffer
		return Image.createRGBImage(destPixels, destW, destH, true);
	}
	
public static Image ZoomImage(Image src, int desW, int desH) {
		Image desImg = null;
		int srcW = src.getWidth(); // 原始图像宽
		int srcH = src.getHeight(); // 原始图像高
		int[] srcBuf = new int[srcW * srcH]; // 原始图片像素信息缓存

		src.getRGB(srcBuf, 0, srcW, 0, 0, srcW, srcH);

		// 计算插值表
		int[] tabY = new int[desH];
		int[] tabX = new int[desW];

		int sb = 0;
		int db = 0;
		int tems = 0;
		int temd = 0;
		int distance = srcH > desH ? srcH : desH;
		for (int i = 0; i <= distance; i++) { /* 垂直方向 */
			tabY[db] = sb;
			tems += srcH;
			temd += desH;
			if (tems > distance) {
				tems -= distance;
				sb++;
			}
			if (temd > distance) {
				temd -= distance;
				db++;
			}
		}

		sb = 0;
		db = 0;
		tems = 0;
		temd = 0;
		distance = srcW > desW ? srcW : desW;
		for (int i = 0; i <= distance; i++) { /* 水平方向 */
			tabX[db] = (short) sb;
			tems += srcW;
			temd += desW;
			if (tems > distance) {
				tems -= distance;
				sb++;
			}
			if (temd > distance) {
				temd -= distance;
				db++;
			}
		}

		// 生成放大缩小后图形像素buf
		int[] desBuf = new int[desW * desH];
		int dx = 0;
		int dy = 0;
		int sy = 0;
		int oldy = -1;
		for (int i = 0; i < desH; i++) {
			if (oldy == tabY[i]) {
				System.arraycopy(desBuf, dy - desW, desBuf, dy, desW);
			} else {
				dx = 0;
				for (int j = 0; j < desW; j++) {
					desBuf[dy + dx] = srcBuf[sy + tabX[j]];
					dx++;
				}
				sy += (tabY[i] - oldy) * srcW;
			}
			oldy = tabY[i];
			dy += desW;
		}

		// 生成图片
		desImg = Image.createRGBImage(desBuf, desW, desH, true);
		return desImg;
	}
	
public static Image scaleImage(Image original, int newWidth, int newHeight) {
		int[] rawInput = new int[original.getHeight() * original.getWidth()];
		original.getRGB(rawInput, 0, original.getWidth(), 0, 0, original
				.getWidth(), original.getHeight());

		int[] rawOutput = new int[newWidth * newHeight];

		// YD compensates for the x loop by subtracting the width back out
		int YD = (original.getHeight() / newHeight) * original.getWidth()
				- original.getWidth();
		int YR = original.getHeight() % newHeight;
		int XD = original.getWidth() / newWidth;
		int XR = original.getWidth() % newWidth;
		int outOffset = 0;
		int inOffset = 0;

		for (int y = newHeight, YE = 0; y > 0; y--) {
			for (int x = newWidth, XE = 0; x > 0; x--) {
				rawOutput[outOffset++] = rawInput[inOffset];
				inOffset += XD;
				XE += XR;
				if (XE >= newWidth) {
					XE -= newWidth;
					inOffset++;
				}
			}
			inOffset += YD;
			YE += YR;
			if (YE >= newHeight) {
				YE -= newHeight;
				inOffset += original.getWidth();
			}
		}
		return Image.createRGBImage(rawOutput, newWidth, newHeight, true);
	}

 

我将100*100的图放大到200*200后对比了一下,ZoomImage生成的图片和另外两个函数生成的图像有点区别,感觉ZoomImage的效果好一点。再放大点就基本一样了看不出区别了。

 

效率上我用6120c测了下:

resizeImage 54~56(μs),

ZoomImage  58~60(μs),

scaleImage   63~65(μs)

 

仅供参考,其实没多大区别的,呵呵。

分享到:
评论

相关推荐

    j2me图片缩放方法

    在J2ME(Java 2 Micro Edition)平台下进行图像处理时,图片的缩放是一个常见的需求。本文将详细介绍三种不同的图片缩放方法,包括它们的工作原理、实现代码及适用场景。 #### 方法一:简单线性缩放 ```java public...

    J2ME图像编辑器和编辑器

    开发者可以使用这个类来裁剪、缩放、旋转图像,并进行颜色处理。为了优化性能,可能需要使用缓冲区策略和内存管理技巧。 **动画制作** 在J2ME中实现动画通常涉及帧序列或时间驱动的更新。开发者可以创建一系列静态...

    几个J2ME手机游戏源代码

    在描述中提到的"几个J2ME手机游戏源代码",我们可以推测这是一组包含了经典游戏的源代码,如飞机射击游戏和俄罗斯方块。这些游戏源代码对于学习J2ME游戏开发的初学者来说非常有价值,因为它们展示了实际的编程实践和...

    J2ME图像处理与二维游戏

    J2ME提供了如`Image`类来处理图像,包括加载、缩放、裁剪等操作。 **典型图像操作**包括颜色转换、图像裁剪、旋转、平移等。这些操作在游戏中的应用广泛,如角色移动、动画制作等。 **图像特效原理**是提升游戏...

    J2ME教学代码整理.rar_j2me_j2me 游戏

    在这个"J2ME教学代码整理.rar"压缩包中,包含了学习J2ME游戏开发的一些实例代码,对于初学者或想要回顾经典移动游戏开发技术的人来说是一份有价值的资源。 首先,"www.pudn.com.txt"可能是一个文档,记录了代码来源...

    J2ME 初学者写的源代码 java 比较简单一点的几个J2ME初学者写的源代码,有关文本处理和图像处理方面的源码。

    对于更复杂的图像操作,如旋转、缩放或裁剪,J2ME可能需要额外的库,如`LWUIT`(Lightweight UI Toolkit)或者第三方库。 以下是一些J2ME初学者可能会遇到的具体例子: 1. 文本读取:使用`FileConnection`接口打开...

    j2me图像存储

    这个“j2me图像存储”项目显然是使用Eclipse集成开发环境(IDE)以及Nokia Development Suite进行的,这表明我们将探讨的是如何在J2ME平台上处理和存储图像数据。 在J2ME中,处理图像通常涉及以下知识点: 1. **...

    J2ME几个经典的项目

    在J2ME中,实现这个游戏主要涉及以下几个知识点: - **用户输入处理**:利用J2ME的KeyListener或者Command接口,监听键盘事件,控制蛇的移动方向。 - **图形绘制**:使用Graphics类进行屏幕绘图,包括蛇、食物和...

    J2ME经验总结之sqrt开方函数(查表法)

    本文将深入探讨如何在J2ME环境中使用查表法实现sqrt开方函数。 查表法的基本思想是预先计算好一部分常用数值的平方根,存储在一个数组中。当需要计算平方根时,通过查找预计算好的表来快速得到结果。这种方式在效率...

    收集几个常用的JAVA J2ME类库.rar

    从网上收集的5个J2ME手机游戏开发类库:  1. LVector.java:Vector实现类;  2. StringTokenizer.java:StringTokenizer类;  3. SimpleCache.java:Cache类;  4. MD5Digest.java:J2ME MD5算法类;  5....

    我的第一个j2me游戏代码

    我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我...

    J2ME开发 J2ME开发 J2ME开发

    J2ME开发涉及以下几个核心概念: 1. **KVM (K Virtual Machine)**:这是J2ME设备上的Java虚拟机,它针对资源有限的设备进行了优化,内存占用小,启动速度快。 2. **MIDP (Mobile Information Device Profile)**:...

    j2me 中的几个小游戏(源码)

    通过阅读源码,我们可以学习到如何使用J2ME的Graphics类进行图像绘制,如何处理用户输入事件,以及如何管理游戏状态。 2. **吃豆子** 吃豆子游戏是一款经典的迷宫追逐游戏,玩家需要控制小豆子在迷宫中吃掉所有...

    一个简单的J2ME动画代码

    2. **绘制函数**:根据当前帧,将相应的图像绘制到画布上,可能涉及到图像的平移、旋转等操作。 3. **帧率控制**:通过计时器或事件驱动来控制每帧的更新间隔,以保证动画的流畅性。 4. **状态更新**:在每帧之间,...

    一个简单的设置J2ME背景

    由于J2ME设备的屏幕大小可能不同,可能需要根据当前设备的屏幕尺寸调整背景图像的位置和缩放。你可以使用`getWidth()`和`getHeight()`方法获取屏幕尺寸,并相应地调整图像位置。 6. **刷新画布**: 如果背景图像...

    j2me开发框架介绍

    EasyMF 是一个 J2ME 开发框架,目标是设计一个简单、稳定、可快速开发的 J2ME 开发框架。它简化了 UI 设计、RMS 操作、日志框架、联网框架、通用工具设计等多个方面。EasyMF 的功能列表包括 UI 框架、日志框架、RMS ...

    j2me_plane.rar_j2me_j2me 飞机_j2me 飞机 游戏_飞机游戏

    J2ME(Java 2 Micro Edition)是Java平台的一个子集,专为移动设备、嵌入式系统等资源有限的环境设计。本篇文章将深入探讨如何利用J2ME技术开发一款简单的飞机游戏,以此帮助初学者理解J2ME编程的基本原理和技巧。 ...

    J2ME插值算法实现图片的放大缩小方法

    J2ME虽然资源有限,但仍然可以通过使用插值算法来实现高质量的图像缩放。插值算法是一种用于提高图像分辨率的方法,它通过在原始像素之间插入新的像素值来实现平滑的放大效果,避免像素化的现象。本文将深入探讨J2ME...

    J2ME 改变图片大小函数

    直接吧函数写在图片方法里,调用填写写大小参数就可以了。

    J2ME API 2.0 J2ME使用手册 J2ME帮助文档

    "midpng-javadoc-final"这个文件名可能指的是MIDP PNG图像处理相关的API文档,对于理解如何在J2ME环境中处理图像和图形操作至关重要。通过深入学习和实践,开发者能够熟练掌握J2ME API,构建出高效且用户体验良好的...

Global site tag (gtag.js) - Google Analytics