Использование камеры. Фотографирование в J2ME

Июнь 13th, 2010 от Abizan Оставить ответ »

Не знаю зачем, но вдруг вам понадобится использовать камеру телефона в своих мобильных приложениях. :) В таком случае, вам поможет MMAPI – Mobile Media API. Импортируйте пакеты javax.microedition.media и javax.microedition.media.control.

Первым делом нужно создать плеер:
Player mPlayer = Manager.createPlayer("capture://video");

Если устройство не поддерживает захват видео, то возникнет MediaException. Проверить поддержку можно так:  System.getProperty("supports.video.capture");. Если вернется true, то поддержка есть.

Далее у плеера нужно выполнить метод realize():
 mPlayer.realize();

Видео с камеры можно отобразить как в форме, так и в Canvas. VideoControl поможет нам в этом, сначала получим его:
 mVideoControl = (VideoControl) mPlayer.getControl("VideoControl");

Если вам нужно, чтобы видео было в Canvas, то инициализируем VideoControl, задаем размер, место размещения в канве и делаем видео видимым. В следующем примере (конструкторе подкласса Canvas) показано, как поместить видео с отступом в 2 пикселя от краев экрана. Если видео нельзя разместить таким образом, то конструктор пытается использовать полноэкранный режим. Затем конструктор вызывает setVisible(), чтобы сделать видео видимым.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public CameraCanvas(VideoControl videoControl) {
  int width = getWidth();
  int height = getHeight();
 
  videoControl.initDisplayMode(
      VideoControl.USE_DIRECT_VIDEO, this);
 
  try {
    videoControl.setDisplayLocation(2, 2);
    videoControl.setDisplaySize(width - 4, height - 4);
  }
  catch (MediaException me) {
    try { videoControl.setDisplayFullScreen(true); }
    catch (MediaException me2) {}
  }
  videoControl.setVisible(true);
}

Отобразить обстановку из камеры в форму можно следующим образом. Вместо параметра USE_DIRECT_VIDEO в VideoControl.initDisplayMode() нужно передавать USE_GUI_PRIMITIVE. Так мы получим Item, который можно поместить на форму.

1
2
3
4
Form form = new Form("Camera form");
Item item = (Item)mVideoControl.initDisplayMode(
    GUIControl.USE_GUI_PRIMITIVE, null);
form.append(item);

Захват картинки

Когда изображение из камеры показывается в приложении, захватить картинку очень просто. Все, что вам нужно, это вызвать метод getSnapshot() у объекта VideoControl. В качестве параметра нужно передать формат получаемого изображения. Если передать null, то будет использоваться формат по умолчанию – PNG. Чтобы получить список поддерживаемых форматов изображений, нужно просмотреть системное свойство video.snapshot.encodings:
System.getProperty("supports.video.capture");

Метод getSnapshot() дает возможность получить снимок в виде байт-массива. Что делать с этим массивом дальше – это уже ваше дело. Можно например сохранить его в файл или rms, послать на сервер, или создать объект Image, чтобы показать пользователю снимок:

1
2
byte[] raw = mVideoControl.getSnapshot(null);
Image image = Image.createImage(raw, 0, raw.length);

Уменьшение картинки

А вот код уменьшения картинки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private Image createThumbnail(Image image, int destWidth) {
  int sourceWidth = image.getWidth();
  int sourceHeight = image.getHeight();
 
  int thumbWidth = destWidth;
  int 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;
}

Здесь image – это исходное изображение, а destWidth – ширина уменьшенного изображения. Высота подгоняется с сохранением пропорций.

Вот в общем-то и все, что я хотел рассказать сегодня. :) Если что-то неясно – пишите в комментарии. И не забудьте подписаться на новости.

Реклама

1 комментарий

  1. radik:

    здравствуйте!!! .у меня нету большого опыта!!!
    я в net beans6.9 j2me ваш пример попытался реализовать выходят ошибки некоторые я из них исправил
    нет у вас примера более полного или исходника
    а то у меня уйдет очень много времени на него.
    заранее благодарен…

Добавить комментарий

Копирование материалов сайта допускается только с разрешения администрации сайта.