public class ImageUtil {
public static final Image zoomImage(Image src){
return zoomImage(src,src.getWidth(),src.getHeight(),true,false);
}
public static final Image zoomImage(Image src, int desW, int desH, boolean isBackgroundTrans, boolean isTrans) {
Image desImg = null;
int srcW = src.getWidth(); // source image width
int srcH = src.getHeight(); // source image height
int[] srcBuf = new int[srcW * srcH]; // source image pixel
src.getRGB(srcBuf, 0, srcW, 0, 0, srcW, srcH);
// compute interpolation table
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++) { /* vertical direction */
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++) { /* horizontal direction */
tabX[db] = (short) sb;
tems += srcW;
temd += desW;
if ( tems > distance) {
tems -= distance;
sb++;
}
if ( temd > distance) {
temd -= distance;
db++;
}
}
// set transparence
// if(isTrans){
// int a= 100;//set the transparence of pixel 100
// for(int i=0;i<srcBuf.length;i++){
// if(srcBuf[i]==0x00FFFFFF)continue;
// srcBuf[i]=(a<<24) | (srcBuf[i] & 0x00FFFFFF);// modify the highest 2 value
// }
// }
// formation enlarge and shorten buffer pixel
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;
}
if(isTrans){
// int a= 100;//set the transparence of pixel 100
for(int i=0;i<desBuf.length;i++){
if(desBuf[i]==0x00FFFFFF)continue;
int alpha = ((desBuf[i] & 0xff000000) >>> 24)==0?0:100;
desBuf[i]=((alpha+1)<<24) | (desBuf[i] & 0x00FFFFFF);// modify the highest 2 value
}
}
if(isBackgroundTrans){
desImg = Image.createRGBImage(desBuf, desW, desH, true);
}else{
desImg = Image.createRGBImage(desBuf, desW, desH, false);
}
return desImg;
}
}
分享到:
- 2007-12-04 13:33
- 浏览 1931
- 评论(1)
- 论坛回复 / 浏览 (0 / 3043)
- 查看更多
相关推荐
总的来说,J2ME中的半透明图片实现主要涉及Alpha通道的修改,而图片缩放则通常通过像素级别的遍历和复制来完成。这些技术在开发J2ME应用时非常有用,但需要考虑到性能和设备兼容性的问题。在实际应用中,开发者应当...
1. **图片缩放**: 缩放是调整图片尺寸的基本操作。源码中可能会有一个 `scaleImage()` 方法,它接收原始图片和目标宽度及高度,通过插值算法(如最近邻插值或双线性插值)来保持图片质量。 2. **图片裁剪**: 裁剪...
1. 图片格式:J2ME支持GIF、PNG和WBMP等格式,但PNG因其优秀的透明度支持和较小的文件大小,常被优先选用。 2. 图片优化:由于J2ME设备的内存和处理能力有限,开发者需要对图片进行压缩和尺寸调整,以减少内存占用并...
由于J2ME的资源限制,直接对大图片进行操作可能会导致性能问题,因此我们需要一个高效的方法来缩放图片。 一种常见的方法是使用`drawImage()` 方法,它是`Graphics`类的一部分。以下是一个简单的示例,演示如何将...
尽管这里没有直接关联,C#中的Xamarin.Forms可以跨平台地创建类似的Splash屏幕,利用.NET Framework和C#的强大功能,开发者可以实现更复杂的效果和动画。在Xamarin中,SplashScreen通常是一个单独的页面,通过导航...
在移动设备上开发应用...总之,这些PNG素材是J2ME开发中的宝贵资源,能够帮助开发者快速构建视觉效果丰富、互动性强的应用程序和游戏。有效的管理和使用这些素材,将有助于提升用户体验,同时降低对设备资源的需求。
本文主要讨论如何使用插值算法在J2ME环境中实现图片的放大和缩小。首先,我们需要理解图像缩放的基本原理。 1. 图像缩放的基本思想: 图像放大或缩小涉及到图像坐标系统的变换。在放大图像时,新的目标图像坐标可能...
TiledLayer允许开发者定义图块的大小和排列方式,通过改变单个图块的位置或状态,可以实现丰富的交互效果和动画。 在J2ME游戏开发中,我们首先需要准备精灵和贴图的图像资源。这可能包括使用图形编辑工具(如GIMP或...
PNG格式因其无损压缩和透明度支持而被广泛用于游戏开发。通过该编辑器,开发者可以轻松地创建、编辑和管理游戏中的各种动画效果,从而提高游戏的视觉表现力。 二、核心功能详解 1. 多张PNG图片导入:编辑器支持...
4. **光照与材质**:Java3D允许设置光源和物体材质,影响3D场景的视觉效果,包括颜色、反射、透明度等。 5. **视点与相机**:开发者可以通过控制视点的位置和方向来改变用户视角,模拟不同的观察效果。 **迷宫游戏...