Как получить изображение с камеры в Windows Mobile

Итак, камера… Windows Mobile версии 5 и выше предоставляет API для работы с камерой мобильного телефона. Что значит “для работы”? А значит это то, что кроме возможности получения изображения, которая будет рассмотрена в этом посте, предоставляемое API позволяет, также, осуществить захват видео любого формата, поддерживаемого Windows Media Player. Все эти радости жизни доступны посредством функции
HRESULT SHCameraCapture (PSHCAMERACAPTURE pshcc);
Документация по функции SHCameraCapture доступна в MSDN здесь, а описание структуры SHCAMERACAPTURE, которая передается в параметр функции, доступно здесь.
А сейчас мы рассмотрим небольшой пример использования выше указанной функции для получения изображения в формате JPG с камеры мобильного устройства. Ниже представлен код функции, которая отображает диалог для работы с камерой, который позволяет сохранить изображение с камеры в файл. После успешного заврешения работы диалога параметр result
будет содержать путь к файлу с изображением.
static bool DoCaptureImage(LPCTSTR captureDir, LPCTSTR defaultFileName, LPTSTR result, DWORD resultSize, HWND parent) { do { HRESULT hResult; SHCAMERACAPTURE shcc; // Заполняем поля структуры SHCAMERACAPTURE. ZeroMemory(&shcc, sizeof(shcc)); shcc.cbSize = sizeof(shcc); shcc.hwndOwner = parent; shcc.pszInitialDir = captureDir; shcc.pszDefaultFileName = defaultFileName; shcc.pszTitle = TEXT("Capture Image"); shcc.nResolutionWidth = 0; shcc.nResolutionHeight = 0; shcc.nVideoTimeLimit = 0; shcc.Mode = CAMERACAPTURE_MODE_STILL; shcc.StillQuality = CAMERACAPTURE_STILLQUALITY_HIGH; // Отображаем диалог для работы с камерой hResult = SHCameraCapture(&shcc); if(hResult != S_OK) break; StringCchCopy(result, resultSize, shcc.szFile); return true; } while(false); return false; }
Идем дальше… Теперь рассмотрим, как все описанное выше можно поиспользовать с wxWidgets и получить изображение в виде переменной wxImage:
static wxImage CaptureImage(WXWidget parent = NULL) { do { // Создаем временное имя файла wxString tempFileName = wxFileName::CreateTempFileName(wxT("capture_")); // Т.к. wxWidgets по умолчанию добавляет расширение .tmp, // а нам надо бы .jpg, то добавляем расширение руками tempFileName += wxT(".jpg"); // Копируем путь к каталогу с временным файлом в буфер TCHAR captureDir[MAX_PATH]; StringCchCopy(captureDir, MAX_PATH, wxPathOnly(tempFileName).GetData()); // Копируем имя файла в буфер TCHAR defaultFileName[MAX_PATH]; StringCchCopy(defaultFileName, MAX_PATH, wxFileName(tempFileName).GetFullName()); TCHAR fileNameBuffer[MAX_PATH]; // Если ошибка то выходим... if (!DoCaptureImage(captureDir, defaultFileName, fileNameBuffer, MAX_PATH, (HWND)parent)) break; // Получаем имя файла в переменную wxString wxString resultFileName(fileNameBuffer); // Загружаем отснятое изображение wxImage result(resultFileName, wxBITMAP_TYPE_ANY); // Удаляем временный файл if(wxFileExists(resultFileName)) wxRemoveFile(resultFileName); // Если изображение было загружено неудачно, то возвращаем false if(!result.IsOk()) break; // Если все нормально, то возвращаем true return result; } while(false); return wxNullImage; }
Вот, такой нехитрый финт ушами позволяет нам получить изображение в виде переменной wxImage
, которую можно использовать в GUI-приложении, например как-то так:
void wxCameraTestWMMainFrame::OnOPENClick( wxCommandEvent& event ) { wxImage capturedImage = wxWMCameraCapture::CaptureImage(GetHandle()); if(capturedImage.IsOk()) { double controlScale = (double)m_StaticBitmap->GetClientSize().GetHeight()/ (double)m_StaticBitmap->GetClientSize().GetWidth(); double imageScale = (double)capturedImage.GetHeight() / (double)capturedImage.GetWidth(); double zoomLevel(1.0); if(imageScale > controlScale) { zoomLevel = (double)m_StaticBitmap->GetSize().GetHeight() / (double)capturedImage.GetHeight(); } else { zoomLevel = (double)m_StaticBitmap->GetSize().GetWidth() / (double)capturedImage.GetWidth(); } wxImage scaledImage = capturedImage.Scale(capturedImage.GetWidth() * zoomLevel, capturedImage.GetHeight() * zoomLevel); m_StaticBitmap->SetBitmap(wxBitmap(scaledImage)); } }
The конец.
Исходный код примера и проект для Visual Studio 2008 можно скачать здесь:
Пример получения изображения с камеры под Windows Mobile
Еще интересные посты о программировании для мобильных устройств:
4 Comments
Make A CommentComments RSS Feed TrackBack URL
September 26th, 2008 at 14:54
Прикольно, полезно – но не компилится .. уже неделю на это убил… склоняюсь к мысли что будет быстрее переписать под C#….
Есть ли еще порталы \ статьи по работе с камерой (С++\С#)? а то что-то инфы как кот наплакал…
September 26th, 2008 at 21:45
Мы уже с тобой обсуждали это в аське. проблема не в примере, а в том что ты что-то не так делаешь. билдлог давай на паст.орг.ру и ссыль сюда
June 6th, 2009 at 14:15
Stich, может поздно, но вот вам недостатья как на шарпе работать с камерой
http://alexmogurenko.com/blog/programming/windows-mobile-capturing-video-from-camera-c/
March 22nd, 2010 at 17:54
Очень нужна помощь в написании программы, которая делает фотоснимок. Если кто-нибудь прочтёт мой коментарий в этой старой статье и сможет помочь, напишите плз в icq: 330-112-063