为照相机添加图片保存功能

本文提供了一个Java示例程序,展示了如何使用VideoControl接口从摄像头捕获快照,并将得到的二进制数据保存为图片文件。示例中包括了获取JPEG格式快照的方法,并实现了简单的用户界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

byte[] data = VideoControl.getSnapshot("encoding=jpeg");返回一个jpeg格式的二进制数据,把这些数据写入文件保存后即为图片。

encoding=png时为png格式。

view plaincopy to clipboardprint?
package lab.sodino.snapshot;  
import java.io.IOException;  
import java.io.OutputStream;  
import javax.microedition.io.Connector;  
import javax.microedition.io.file.FileConnection;  
import javax.microedition.lcdui.Alert;  
import javax.microedition.lcdui.Canvas;  
import javax.microedition.lcdui.Command;  
import javax.microedition.lcdui.CommandListener;  
import javax.microedition.lcdui.Display;  
import javax.microedition.lcdui.Displayable;  
import javax.microedition.lcdui.Form;  
import javax.microedition.lcdui.Image;  
import javax.microedition.lcdui.StringItem;  
import javax.microedition.lcdui.TextField;  
import javax.microedition.media.Manager;  
import javax.microedition.media.MediaException;  
import javax.microedition.media.Player;  
import javax.microedition.media.control.VideoControl;  
import javax.microedition.midlet.MIDlet;  
import javax.microedition.midlet.MIDletStateChangeException;  
import com.sun.perseus.model.ImageNode;  
public class SnapshotTest extends MIDlet implements CommandListener {  
    private Display mDisplay;  
    private Player mPlayer;  
    private VideoControl mVideoControl;  
    private Form f;  
    private Command exitCom, cameraCom, backCom, snapshotCom, saveCom;  
    private TextField tf;  
    byte[] raw;  
    TextField imageName;  
    public SnapshotTest() {  
        exitCom = new Command("Exit", Command.EXIT, 0);  
        cameraCom = new Command("Camera", Command.SCREEN, 0);  
        backCom = new Command("Back", Command.BACK, 0);  
        snapshotCom = new Command("Capture", Command.SCREEN, 0);  
        saveCom = new Command("Save", Command.SCREEN, 0);  
        f = new Form("snapshot");  
        f.addCommand(exitCom);  
        String supports = System.getProperty("video.snapshot.encodings");  
        if (supports != null && supports.length() > 0) {  
            f.append("ready to snapshot...");  
            f.addCommand(cameraCom);  
        } else {  
            f.append("sorry,not supported!");  
        }  
        f.setCommandListener(this);  
    }  
    protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {  
    }  
    protected void pauseApp() {  
    }  
    protected void startApp() throws MIDletStateChangeException {  
        mDisplay = Display.getDisplay(this);  
        mDisplay.setCurrent(f);  
    }  
    public void commandAction(Command c, Displayable d) {  
        if (c.getCommandType() == Command.EXIT) {  
            try {  
                destroyApp(true);  
            } catch (MIDletStateChangeException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
            notifyDestroyed();  
        } else if (c == cameraCom) {  
            showCamera();  
        } else if (c == backCom) {  
            mDisplay.setCurrent(f);  
        } else if (c == snapshotCom) {  
            capture();  
        } else if (c == saveCom) {  
            save();  
        }  
    }  
    private void showCamera() {  
        try {  
            mPlayer = Manager.createPlayer("capture://video");  
            mPlayer.realize();  
            mVideoControl = (VideoControl) mPlayer.getControl("VideoControl");  
            Canvas canvas = new CameraCanvas(this, mVideoControl);  
            canvas.addCommand(backCom);  
            canvas.addCommand(snapshotCom);  
            canvas.setCommandListener(this);  
            mDisplay.setCurrent(canvas);  
            mPlayer.start();  
        } catch (IOException ioe) {  
        } catch (MediaException me) {  
        }  
    }  
    public void capture() {  
        try {  
            // raw = mVideoControl.getSnapshot("encoding=jpeg");  
            // raw = mVideoControl.getSnapshot("encoding=png");  
            raw = mVideoControl.getSnapshot(null);  
            Image img = Image.createImage(raw, 0, raw.length);  
            if (f.size() > 0 && (f.get(0) instanceof StringItem == true)) {  
                f.delete(0);  
            }  
            imageName = new TextField("ImageName", null, 256, TextField.ANY);  
            f.append(imageName);  
            f.append(img);  
            f.removeCommand(cameraCom);  
            f.addCommand(saveCom);  
            mDisplay.setCurrent(f);  
            mPlayer.close();  
            mPlayer = null;  
            mVideoControl = null;  
        } catch (MediaException me) {  
            System.out.println(me);  
        }  
    }  
    public void save() {  
        String name = imageName.getString();  
        String initDir = System.getProperty("fileconn.dir.photos");  
        try {  
            System.out.println(initDir + name);  
            FileConnection fc = (FileConnection) Connector.open(initDir + name);  
            fc.create();  
            OutputStream fos = fc.openOutputStream();  
            fos.write(raw);  
            fos.close();  
        } catch (Exception e) {  
        }  
        Alert a = new Alert("Save Resuit:", "save success....", null, null);  
        a.setTimeout(2000);  
        mDisplay.setCurrent(a, f);  
    }  

package lab.sodino.snapshot;
import java.io.IOException;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.control.VideoControl;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import com.sun.perseus.model.ImageNode;
public class SnapshotTest extends MIDlet implements CommandListener {
 private Display mDisplay;
 private Player mPlayer;
 private VideoControl mVideoControl;
 private Form f;
 private Command exitCom, cameraCom, backCom, snapshotCom, saveCom;
 private TextField tf;
 byte[] raw;
 TextField imageName;
 public SnapshotTest() {
  exitCom = new Command("Exit", Command.EXIT, 0);
  cameraCom = new Command("Camera", Command.SCREEN, 0);
  backCom = new Command("Back", Command.BACK, 0);
  snapshotCom = new Command("Capture", Command.SCREEN, 0);
  saveCom = new Command("Save", Command.SCREEN, 0);
  f = new Form("snapshot");
  f.addCommand(exitCom);
  String supports = System.getProperty("video.snapshot.encodings");
  if (supports != null && supports.length() > 0) {
   f.append("ready to snapshot...");
   f.addCommand(cameraCom);
  } else {
   f.append("sorry,not supported!");
  }
  f.setCommandListener(this);
 }
 protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
 }
 protected void pauseApp() {
 }
 protected void startApp() throws MIDletStateChangeException {
  mDisplay = Display.getDisplay(this);
  mDisplay.setCurrent(f);
 }
 public void commandAction(Command c, Displayable d) {
  if (c.getCommandType() == Command.EXIT) {
   try {
    destroyApp(true);
   } catch (MIDletStateChangeException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   notifyDestroyed();
  } else if (c == cameraCom) {
   showCamera();
  } else if (c == backCom) {
   mDisplay.setCurrent(f);
  } else if (c == snapshotCom) {
   capture();
  } else if (c == saveCom) {
   save();
  }
 }
 private void showCamera() {
  try {
   mPlayer = Manager.createPlayer("capture://video");
   mPlayer.realize();
   mVideoControl = (VideoControl) mPlayer.getControl("VideoControl");
   Canvas canvas = new CameraCanvas(this, mVideoControl);
   canvas.addCommand(backCom);
   canvas.addCommand(snapshotCom);
   canvas.setCommandListener(this);
   mDisplay.setCurrent(canvas);
   mPlayer.start();
  } catch (IOException ioe) {
  } catch (MediaException me) {
  }
 }
 public void capture() {
  try {
   // raw = mVideoControl.getSnapshot("encoding=jpeg");
   // raw = mVideoControl.getSnapshot("encoding=png");
   raw = mVideoControl.getSnapshot(null);
   Image img = Image.createImage(raw, 0, raw.length);
   if (f.size() > 0 && (f.get(0) instanceof StringItem == true)) {
    f.delete(0);
   }
   imageName = new TextField("ImageName", null, 256, TextField.ANY);
   f.append(imageName);
   f.append(img);
   f.removeCommand(cameraCom);
   f.addCommand(saveCom);
   mDisplay.setCurrent(f);
   mPlayer.close();
   mPlayer = null;
   mVideoControl = null;
  } catch (MediaException me) {
   System.out.println(me);
  }
 }
 public void save() {
  String name = imageName.getString();
  String initDir = System.getProperty("fileconn.dir.photos");
  try {
   System.out.println(initDir + name);
   FileConnection fc = (FileConnection) Connector.open(initDir + name);
   fc.create();
   OutputStream fos = fc.openOutputStream();
   fos.write(raw);
   fos.close();
  } catch (Exception e) {
  }
  Alert a = new Alert("Save Resuit:", "save success....", null, null);
  a.setTimeout(2000);
  mDisplay.setCurrent(a, f);
 }
} view plaincopy to clipboardprint?
package lab.sodino.snapshot;  
import javax.microedition.lcdui.Canvas;  
import javax.microedition.lcdui.Graphics;  
import javax.microedition.media.MediaException;  
import javax.microedition.media.control.VideoControl;  
public class CameraCanvas extends Canvas {  
    private SnapshotTest mMidlet;  
    int width = getWidth();  
    int height = getHeight();  
    public CameraCanvas(SnapshotTest midlet, VideoControl videoCon) {  
        mMidlet = midlet;  
        videoCon.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);  
        videoCon.setDisplayLocation(2, 2);  
        try {  
            videoCon.setDisplaySize(width - 4, height - 4);  
        } catch (MediaException e) {  
            try {  
                videoCon.setDisplayFullScreen(true);  
            } catch (MediaException me) {  
                System.out.println(me);  
            }  
        }  
        videoCon.setVisible(true);  
    }  
    protected void paint(Graphics g) {  
        g.setColor(0x0000ff);  
        g.drawRect(0, 0, width - 1, height - 1);  
        g.drawRect(1, 1, width - 3, height - 3);  
    }  
    public void keyPressed(int keyCode) {  
        int action = getGameAction(keyCode);  
        if (action == FIRE) {  
            mMidlet.capture();  
        }  
    }  

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/sodino/archive/2010/03/13/5377437.aspx

http://www.guaiguaier.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值