博文

转贴 在MIDP2.0中操作图片像素(2007-05-08 20:31:00)

摘要:正文
   我们知道,在MIDP1.0中,除非我们利用特定厂商的API(比如Nokia),我们是没法对图片的像素进行操作的,但是在MIDP2.0中,Image和Graphics的功能都大大增强了。比如,我们可以获取Image的所有像素值,然后利用程序来修改这些像素(比如说ARGB各自的值),最后再把修改后的像素图绘制出来。通过直接操作图片像素,我们就获得了一种很强大的能力,用编程的方式实现出很多有趣的效果来,而不用额外制作新图片。比如说透明度渐变,颜色反转等。下面就是2个例子,分别实现透明度渐变和颜色反转的功能。

例题一: 透明度渐变效果的实现
   给定一张图片,假如我们想实现这么一种效果:图片由全透明状态逐渐清晰,最后达到正常状态。要实现这一个过程,我们首先要获取该图片的所有像素值,逐步让这些像素的alpha值从0转变到正常,每改变图片的所有像素值一次,我们就请求刷屏一次,把最新的像素图画出来,这样我们就能实现透明度渐变的效果了。代码实现如下:
import java.io.IOException; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; /**  *   * @author Jagie  *   */ public class ShadowMIDlet extends MIDlet {   ......

阅读全文(2752) | 评论:0

转贴 J2ME插值算法实现图片的放大缩小(2007-05-08 20:17:00)

摘要:前段时间接触了一些数字图像处理的问题,在1位师兄的指导下,在j2me平台,完成了一些基本的2D图像处理算法。就当是对这段知识做一下总结,决定把这些算法写出来,和各位朋友共同探讨。这篇文章先介绍图像放大缩小的实现,程序是以Nokia S40的机器为平台实现的。
1、实现图形缩放的基本思想:
图像的变形变换,简单的说就是把源图像每个点坐标通过变形运算转为目标图像相应点的新坐标,但是这样会导致一个问题就是目标点的坐标通常不会是整数。所以我们在做放大变换时,需要计算生成没有被映射到的点;而在缩小变换时,需要删除一些点。这里我们采用最简单的一种插值算法:“最近邻域法”。顾名思义,就是把非整数坐标作一个四舍五入,取最近的整数点。
看下面的一个图片放大的例子,左图为原始图像,右图为放大1倍的图像。里面的数字,表示所在像素的信息
1 2 1 1 2 2 5 4 5 5 4 4 2、对于图片像素的操作:
获取Image图片像素信息:
标准的midp1.0没有提供获取图片像素信息的函数,对于NOKIA的机器,我们可以采用Nokia SDK提供的API获取像素信息。具体程序如下:
g = image.getGraphics()
DirectGraphics dg = DirectUtils.getDirectGraphics(g);
dg.getPixels(short[] pixels, int offset, int scanlength, int x,int y, int width, int height, int format)
参数介绍:
short[] pixels: 用于接收像素信息的数组
int offset:这篇文章中的用到的地方,添0就可以了
int scanlength:添图片的宽度就行了
int x:添0
int y:添0
int width:图片宽度
int height:图片高度
int format:444,表示图形格式,好像Nokia S40的机器都是采用444格式表示RGB颜色的。就是红,绿,蓝各用4位表示,至于可以表示透明色ARGB的4444格式,应该是机器硬件实现的。
想具体了解Nokia SDK的信息,可以查看Nokia SD......

阅读全文(3839) | 评论:0

J2ME 有关在IMAGE图片上画东西(2007-05-05 16:19:00)

摘要:im=Image.createImage("/2.png");
 //Graphics g=im.getGraphics();
 System.out.println("!!!11!!!!");   是可以通过的,而且出现图片   im=Image.createImage("/2.png");
 //Graphics g=im.getGraphics();
 System.out.println("!!!11!!!!");
 
g.setColor(0x009960ee);//在图片上画了东西@@@@
g.drawString("黑白两种色?",0,20,Graphics.TOP|Graphics.LEFT);//线程里面计算时间
g.drawRect(0,0,50,50); 这样就不行, im=Image.createImage(90,90);//这里有变@@@@@  //Graphics g=im.getGraphics();
 System.out.println("!!!11!!!!");
 
g.setColor(0x009960ee);
g.drawString("黑白两种色?",0,20,Graphics.TOP|Graphics.LEFT);//线程里面计算时间
g.drawRect(0,0,50,50);   这样却可以了,不得其解。......

阅读全文(2585) | 评论:1

有关Image.createImage()图片路径问题(2007-05-05 15:32:00)

摘要:如果是用WTK,例如Image.createImage("/2.png");/2.png就放在rec文件下 如果Image.createImage("/src/2.png");创建的话,就要在rec文件下创建src文件,再将原来的图片覆盖到该文件下。 问题是如果是用了package打包后路径更加复杂!......

阅读全文(4624) | 评论:2

总按钮类(2007-04-26 15:01:00)

摘要:/** 总按钮 @2007426 */ /** 自己写个按钮类吧 */ package com.sword; import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.*;
public class AllButton extends GameCanvas implements Runnable{  public AllButton(){
 super(true);
     } /**
创建按钮
*/ 
 public Image CreateButton(String s){
 Image im=null;
 try{
 im=Image.createImage(s);
    }
 catch(Exception e){}
 
 return im;
           } /**
Sprite
*/
 public Sprite CreateButton(String s,int x,int y){
 Sprite im=null;
 try{
 im=new Sprite(Image.createImage(s),x,y);
    }
 catch(Exception e){}
 
 return im;
             &nbs......

阅读全文(2532) | 评论:0

J2ME 有关package问题(2007-04-24 13:58:00)

摘要:有引用自己包内的类问题 经常忘记,不得写点东西记住一下: WTK似乎有个设置启动类的,如果包名不相符,是引用失败,但是这次我没设置,居然也成功了,晕,以后再看看什么问题了. //package com.sword; import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.*;
import java.util.*;
import com.sword.a; public class Football2007 extends MIDlet{
  public void startApp(){
 System.out.println("ok");
 new a();
    }
  public void pauseApp(){}    public void destroyApp(boolean e){
    notifyDestroyed();
     }
     } //////////////////////////////////////////// package com.sword;
public class a{//注意要public 不然就是墨认protected,只能包内才能引用
 public a(){
 System.out.println("a");}
 } 这样就可以了,以后再补充一下其他问题.
......

阅读全文(2719) | 评论:0

Football2007(2007-04-24 13:21:00)

摘要:/** 打算做个足球类游戏 Football2007 @2007424 */   /** 多个类,各自提交控制,注意资源 */ //package com.sword; import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.*;
import java.util.*;
import com.sword.FootballMenu; public class Football2007 extends MIDlet{
 Display d=Display.getDisplay(this);   public void startApp(){
 System.out.println("ok");
 new FootballMenu(d);
    }   public void pauseApp(){}    public void destroyApp(boolean e){
    notifyDestroyed();
     }
     }
/** */ package com.sword; import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.*; public class FootballMenu extends GameCanvas imp......

阅读全文(2476) | 评论:0

J2ME-qq组队留言(2007-03-04 16:19:00)

摘要:交谈中请勿轻信汇款、中奖等消息,更不要透露密码、银行帐号等个人信息。 梦念蝶儿 14:19:41
兄弟在不?
梦念蝶儿 14:21:28
啥时候在线说一声,我还在学校里面,晚上10点半就停电了。其它时候就可以时时在了 找个时间好好交流一下
梦念蝶儿 14:21:52
元宵节快东
梦念蝶儿 14:22:02
快乐
_BAT_姜维 16:16:12
元宵节快乐....
我这排要参加考试
其实如果你PS和音乐都行的话,两个人大概都可以了
不过就是搞些比较弱智的游戏,但是时下又是很大部分喜欢玩的.
音乐可以先跳过去不管,但是图片和游戏策划是必要的,我处理程序方面的.
游戏关卡玩法这些是第一要素,图片又可以排第二位
我采取渐进试编写程序,先把可以实现的关卡和过程先完成在测试,然后优化. 交谈中请勿轻信汇款、中奖等消息,更不要透露密码、银行帐号等个人信息。 梦念蝶儿 16:15:35
那打算什么时候正式开始呢?
_BAT_姜维 16:18:57
你现在大几?
梦念蝶儿 16:16:34
自由了,开始找工作了,只是我不想太早出去,时间多的是
_BAT_姜维 16:19:56
那么说你经济尚可咯
现在准备找什么工作呢
梦念蝶儿 16:17:37
我是打算把这个学好.以后最好走这条路,
_BAT_姜维 16:20:40
程序吗?
梦念蝶儿 16:18:11
和你的想法一样,最好以后在一个游戏公司工作 梦念蝶儿 16:18:20
手机游戏 _BAT_姜维 16:21:27
对啊
你JAVA学得怎么样
_BAT_姜维 16:21:57
J2ME很简单
如果JAVA基础好的一星期就可以自由开发了
梦念蝶儿 16:19:09
只能说是马马虎虎,自学的.我们没开这个课,现在学J2ME学的不得要领
梦念蝶儿 16:19:29
我就是没学过JAVA,所以学起来比较
梦念蝶儿 16:19:31
比较难
_BAT_姜维 16:22:27
跟我差不多啊
汗 梦念蝶儿 16:20:17
那就请你以后多指导了.
_BAT......

阅读全文(14) | 评论:0

我的第一次j2me面试(2007-03-01 12:08:00)

摘要:
_BAT_姜维 11:28:42
独立的应用程序
我晕 11:27:12
那用到Swing 
_BAT_姜维 11:29:17
连到机上数据库
_BAT_姜维 11:29:29
用到
AWT
我晕 11:28:09
噢,那界面应该比较简单些了
_BAT_姜维 11:30:17

JAVA那时候没怎么理会界面
 
_BAT_姜维 11:31:14
就是实现功能
我晕 11:29:39
Java里,多线程访问共享资源的时候,应当如何避免冲突,能写一个简单的例子吗?
_BAT_姜维 11:32:55
用锁,这程序没写过
我晕 11:32:43
那Java的锁的使用方式是怎样的?例如,什么关键字?
_BAT_姜维 11:35:13
英文不好单词老是记不住
在定义方法的前面加个S什么的了
我晕 11:33:51
在你开发的J2ME游戏里面,没有用到多线程么?
_BAT_姜维 11:35:53
用到
_BAT_姜维 11:36:39
可能我用的简单
令动画运动或者计时
我晕 11:35:42
你有没有在网上找一些游戏的例子来看?
_BAT_姜维 11:38:14
看过,包括书上。
我晕 11:36:53
现在一般的游戏架构都差不多,用单线程控制整个游戏世界的推进
_BAT_姜维 11:38:54
都是在RUN方法内用一WHILE,然后是接收键盘输入
_BAT_姜维 11:39:22
哦对
在J2ME里我没接触过用锁的
_BAT_姜维 11:40:09
可能我的层次还比较低吧,呵呵。
我晕 11:38:55
J2ME游戏倒是很少用到
我晕 11:39:40
问几个Java基础知识的问题吧
_BAT_姜维 11:41:44

 
我晕 11:40:10
定义一个5*5的二维字符串数组,应该怎么写?
_BAT_姜维 11:42:45
String a[]=new Str......

阅读全文(12) | 评论:0

[转]编写java最常见的21种错误 (2006-12-26 22:14:00)

摘要:1.Duplicated Code
  代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应OAOO是一个好系统的重要标志。
2.Long method
  它是传统结构化的“遗毒”。一个方法应当具有自我独立的意图,不要把几个意图放在一起。
3.Large Class
  大类就是你把太多的责任交给了一个类。这里的规则是One Class One Responsibility.
4.Divergent Change
  一个类里面的内容变化率不同。某些状态一个小时变一次,某些则几个月一年才变一次;某些状态因为这方面的原因发生变化,而另一些则因为其他方面的原因变一次。面向对象的抽象就是把相对不变的和相对变化相隔离。把问题变化的一方面和另一方面相隔离。这使得这些相对不变的可以重用。问题变化的每个方面都可以单独重用。这种相异变化的共存使得重用非常困难。
5.Shotgun Surgery
  这正好和上面相反。对系统一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。
6.Feature Envy
 对象的目的就是封装状态以及与这些状态紧密相关的行为。如果一个类的方法频繁用get 方法存取其他类的状态进行计算,那么你要考虑把行为移到涉及状态数目最多的那个类。
7.Data Clumps
  某些数据通常像孩子一样成群玩耍:一起出现在很多类的成员变量中,一起出现在许多方法的参数中,这些数据或许应该自己独立形成对象。
8.Primitive Obsession
  面向对象的新手通常习惯使用几个原始类型的数据来表示一个概念。譬如对于范围,他们会使用两个数字。对于Money,他们会用一个浮点数来表示。因为你没有使用对象来表达问题中存在的概念,这使得代码变的难以理解,解决问题的难度大大增加。好的习惯是扩充语言所能提供原始类型,用小对象来表示范围、金额、转化率、邮政编码等等。
9.Switch Statement
  基于常量的开关语句是OO 的大敌,你应当把他变为子类、state或strategy.
10. Parallel Inhe......

阅读全文(2286) | 评论:0