Friday, April 23, 2010

Video Snapshot in NOKIA3110 using J2ME & Media API

This is a Midlet build in J2ME.

It is compatible with NOKIA Phone, specially with the NOKIA3110.

Following are the files under the Sun's Wireless Toolkit JDK.

 src
 |_CaptureVideo.java
 |_ImageCanvas.java
 |_VideoCanvas.java
 |_VideoSnap.java

CaptureVideo.java:-
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.io.file.*;
import javax.microedition.io.file.FileConnection;
import javax.microedition.lcdui.*;
import javax.microedition.media.MediaException;
import javax.microedition.media.control.VideoControl;

public class CaptureVideo extends Thread {
 public VideoSnap midlet;
 public VideoControl videoControl;
 public VideoCanvas canvas;
 public CaptureVideo(VideoCanvas canvas, VideoSnap midlet, VideoControl vc) {
  this.canvas = canvas;
  this.midlet = midlet;
  this.videoControl = vc;
 } 
 public void run() {
  try     {
   byte[] raw = videoControl.getSnapshot("encoding=jpeg");
   Image image = Image.createImage(raw, 0, raw.length);
   if(canvas.imageNumber == 5)
    return;
   canvas.images[canvas.imageNumber] = raw; //Adding Image byte Array to Image Array
   Image resizedImage = createThumbnail(image); //Resize image to thumbnail
   canvas.thumbImages[canvas.imageNumber] = resizedImage; // Add thumbnail image to image Array
   canvas.imageNumber++;
   canvas.repaint();
  } catch (Exception e) {
   Alert mediaExceptionAlert = new Alert("Media Exception","Cannot Capture Image: "+e.toString(),null,AlertType.INFO);
   mediaExceptionAlert.setTimeout(3000);
   midlet.display.setCurrent(mediaExceptionAlert);
  }
 }
 private Image createThumbnail(Image image) {
  int sourceWidth = image.getWidth();
  int sourceHeight = image.getHeight();
  int thumbWidth = 35;
  int thumbHeight = -1;
  if (thumbHeight == -1)
   thumbHeight = thumbWidth * sourceHeight / sourceWidth;
  Image thumb = Image.createImage(thumbWidth, thumbHeight);
  Graphics g = thumb.getGraphics();
  for (int y = 0; y < thumbHeight; y++) {
   for (int x = 0; x < thumbWidth; x++) {
    g.setClip(x, y, 1, 1);
    int dx = x * sourceWidth / thumbWidth;
    int dy = y * sourceHeight / thumbHeight;
    g.drawImage(image, x - dx, y - dy, Graphics.LEFT | Graphics.TOP);
   }
  }
  Image immutableThumb = Image.createImage(thumb);
  return immutableThumb;
 }
}


ImageCanvas.java:-
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.io.file.*;
import javax.microedition.io.file.FileConnection;
import javax.microedition.lcdui.*;
import javax.microedition.media.MediaException;
import javax.microedition.media.control.VideoControl;

public class ImageCanvas extends Canvas {
 public VideoSnap midlet;
 public VideoCanvas canvas;
 public byte[] img;
 
 public ImageCanvas(VideoSnap midlet, VideoCanvas canvas, byte[] img) {
  this.midlet = midlet;
  this.canvas = canvas;
  this.img = img;
  setFullScreenMode(true);
    }
    public void paint(Graphics g) {
        Image image = Image.createImage(img, 0, img.length);
  g.drawImage(image, 0, 0, 0);
  g.setColor(128,128,128);
  g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL));
  g.drawString("Save",54,151,0);
  g.drawString("Back",112,151,0);
 }
 protected void keyPressed(int paramInt) {
  if(paramInt == -7) {
   midlet.display.setCurrent(canvas);
  } else if(paramInt == -5) {
   saveImage();
  }
 }
 void saveImage() {
  try {
   FileConnection fc = null;
   for(int i=0; i < 100; i++) {
    fc = (FileConnection) Connector.open("file:///E:/image_"+i+".jpg");
    if(fc.exists())
     continue;
    else
     break;
   }
   fc.create();
   OutputStream out = fc.openOutputStream();
   out.write(img);
   out.flush();
   out.close();
   
   Alert alert = new Alert("Image","Image Saved...",null,AlertType.INFO);
   alert.setTimeout(3000);
   midlet.display.setCurrent(alert);
  } catch(Exception e) {
   Alert alert = new Alert("Exception"," Image not Saved..."+e.toString(),null,AlertType.INFO);
   alert.setTimeout(3000);
   midlet.display.setCurrent(alert);
  }
 }
}

VideoCanvas:-
import javax.microedition.lcdui.*;
import javax.microedition.media.MediaException;
import javax.microedition.media.control.VideoControl;

public class VideoCanvas extends Canvas {
  public VideoSnap midlet;
  public VideoControl videoControl;
  public int imageNumber = 0;
  public byte[][] images = new byte[5][];
  public Image[] thumbImages = new Image[5];
  public int[] imageLocations = {72, 10, 72, 57, 1, 104, 37, 104, 73, 104};
  public VideoCanvas(VideoSnap midlet, VideoControl vc) {
    this.midlet = midlet;
    this.videoControl = vc;
    int width = getWidth();
    int height = getHeight();
    setFullScreenMode(true);
    videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);
    try {
      videoControl.setDisplayLocation(1, 10);
      videoControl.setDisplaySize(70, 93);
      videoControl.setDisplayFullScreen(false);
    } catch (MediaException me) {}
    videoControl.setVisible(true);
  }
  void drawImageOnCanvas(Graphics g) {
    for(int i=0; i      if(thumbImages[i] != null)
        g.drawImage(thumbImages[i], imageLocations[2*i], imageLocations[2*i+1], 0);
  }
  public void paint(Graphics g) {
    int width = getWidth();
    int height = getHeight();
    g.setColor(128,128,128);
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL));
    g.drawString("Shri Ganesha",33,1,0);
    g.setColor(0, 0, 0);
    g.drawString("Capture",50,151,0);
    g.drawString("Exit",112,151,0);
    if(thumbImages.length > 0)
      drawImageOnCanvas(g);
  }
  protected void keyPressed(int paramInt) {
    if(paramInt == -7) {
      midlet.destroyApp(true);
      midlet.notifyDestroyed();
    } else if(paramInt == -5) {
      CaptureVideo cv = new CaptureVideo(this, midlet, videoControl);
      cv.start();
    } else if(paramInt == 49 && images[0] != null) {
      ImageCanvas imgCanvas = new ImageCanvas(midlet, this, images[0]);
      midlet.display.setCurrent(imgCanvas);
    } else if(paramInt == 50 && images[1] != null) {
      ImageCanvas imgCanvas = new ImageCanvas(midlet, this, images[1]);
      midlet.display.setCurrent(imgCanvas);
    } else if(paramInt == 51 && images[2] != null) {
      ImageCanvas imgCanvas = new ImageCanvas(midlet, this, images[2]);
      midlet.display.setCurrent(imgCanvas);
    } else if(paramInt == 52 && images[3] != null) {
      ImageCanvas imgCanvas = new ImageCanvas(midlet, this, images[3]);
      midlet.display.setCurrent(imgCanvas);
    } else if(paramInt == 53 && images[4] != null) {
      ImageCanvas imgCanvas = new ImageCanvas(midlet, this, images[4]);
      midlet.display.setCurrent(imgCanvas);
    }
  }
}

VideoSnap.java:-
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.media.control.VideoControl;
public class VideoSnap extends MIDlet {
  public Display display;
  private Player player;
  private VideoControl videoControl;
  public void startApp() {
    display = Display.getDisplay(this);
    try {
      //player = Manager.createPlayer("capture://video");
      player = Manager.createPlayer("capture://image");
      player.realize();
      player.prefetch();
      videoControl = (VideoControl)player.getControl("VideoControl");
      Canvas canvas = new VideoCanvas(this, videoControl);
      display.setCurrent(canvas);
      player.start();
    } catch (IOException ioe) {} catch (MediaException me) {}
  }
  public void pauseApp() {}
  public void destroyApp(boolean unconditional) {
  player.close();
  }
}


Just compile this program & use it.

For more information visit Dwij IT Solutions.

No comments:

Post a Comment

Your comments will be important to impprove this blog.
Please have some comments or doubts freely.