j2me 拍照并保存至本地

<!-- p { margin-bottom: 0.08in; } -->

J2me 拍照上传到网络,可折腾了我好长一段时间。要好好整理一下。

1、如何实现拍照?

/** * 实现拍照功能 * @Date 2010-11-18 * @author PengXiangXiang */ public class TakePhotoPage { private VideoControl vc; private Item photoFrame; private Command cmdTake; private Form frm; private Display dis; // 拍照后得到的图片二进制数组 private byte[] imgbytes; public TakePhotoPage(Midlet midlet) { dis = Display.getDisplay(midlet); frm = new Form(""); cmdTake = new Command("拍照", Command.ITEM, 1); } public void showPage() { Player p; try { p = Manager.createPlayer("capture://video"); p.realize(); vc = (VideoControl) p.getControl("VideoControl"); photoFrame = (Item) vc.initDisplayMode( VideoControl.USE_GUI_PRIMITIVE, null); vc.setDisplaySize(240,400); vc.setDisplayLocation(0, 0); p.start(); } catch (IOException ex) { } catch (MediaException ex) { } frm.append(photoFrame); frm.addCommand(cmdTake); dis.setCurrent(frm); frm.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable d) { if (c == cmdTake) { try { imgbytes = vc.getSnapshot("encoding=png&width=160&height=120"); } catch (MediaException ex) { ex.printStackTrace(); } if(imgbytes != null){ bFlag = false; if(imgbytes.length == 0){ System.out.println("imgbytes is null"); }else{ Image srcImg = Image.createImage(imgbytes, 0, imgbytes.length); frm.removeAll(); frm.append(srcImg); } } } } }); } }

2 、如何将拍照得到的图片存到手机本地?

String root = "file:///root1/pxx.png"; FileConnection fc = null; try { fc = (FileConnection) Connector.open(root); System.out.println("fileisExist:" + fc.exists()); if (!fc.exists()){ // 若文件不存在,创建文件 fc.create(); } OutputStream os = fc.openOutputStream();// 打开输出流 os.write(imgbytes);// 将图片的二进制数组写入 os.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }


上面这两段代码看起来容易,实现编写的过程中还是有好些需要注意的地方。

譬如第一段代码中的拍照函数:imgbytes = vc.getSnapshot("encoding=png&width=160&height=120");

括号里的参数是用来指定拍出来的照片的属性。也可以传null,那样手机就会按系统默认的属性来处理拍出来的图片。如果这里指定的格式与你存到本地时指定的格式不相符,那就会造成写到本地的图片可以预览但无法打开。

具体这个括号里还可传些什么参数,可以参阅http://blog.youkuaiyun.com/c30gcrk/archive/2007/08/28/1762299.aspx

另外,第一段代码中拍照的动作是在动作处理的线程中,没有单独开一个线程去做。这在netbeans中开发的时候不会有什么问题,如果是在eclipse中,它会在控制台提示你需要将拍照动作放到另外一个线程。

第二段代码中,String root = "file:///root1/pxx.png";里的root1是WTK的模拟器中存放手机文件的目录。我是在ubuntu下做的开发,之前路径写的是:"file:///home/pengxiangxiang/pxx.png",即我电脑上的文件路径,运行起来就一直报路径不可访问。后来运行正常后,我在WTK安装路径(WTK2.5.2/j2mewtk_template/appdb/DefaultColorPhone/filesystem/root1)下找pxx.png.硬是找不到,我还以为没有保存成功。后来通过搜索,才发现它在另一个地方:

j2mewtk/2.5.2/appdb/DefaultColorPhone/filesystem/root1

这两个路径的关系我还没好好弄清楚,哪位知道的就告诉我一声哈。

另处其实我还遇到一个问题,拍照后得到的二进制数组,如果直接传给服务器端,服务器端获取图片宽高时会出错,但如果我将其在本地存一下再读取这张图片上传就没有问题。这个情况我还没有解决呢。哪位知道的也告诉我一声哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值