Не знаю зачем, но вдруг вам понадобится использовать камеру телефона в своих мобильных приложениях.
В таком случае, вам поможет 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 – ширина уменьшенного изображения. Высота подгоняется с сохранением пропорций.
Вот в общем-то и все, что я хотел рассказать сегодня.
Если что-то неясно – пишите в комментарии. И не забудьте подписаться на новости.
http://javabegin.ru/
здравствуйте!!! .у меня нету большого опыта!!!
я в net beans6.9 j2me ваш пример попытался реализовать выходят ошибки некоторые я из них исправил
нет у вас примера более полного или исходника
а то у меня уйдет очень много времени на него.
заранее благодарен…