Aug
10

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

Google Buzz

Итак, камера… 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 Comment
  • Stich Said:

    Прикольно, полезно – но не компилится .. уже неделю на это убил… склоняюсь к мысли что будет быстрее переписать под C#….

    Есть ли еще порталы \ статьи по работе с камерой (С++\С#)? а то что-то инфы как кот наплакал…

  • T-Rex Said:

    Мы уже с тобой обсуждали это в аське. проблема не в примере, а в том что ты что-то не так делаешь. билдлог давай на паст.орг.ру и ссыль сюда

  • DaBEAT Said:

    Stich, может поздно, но вот вам недостатья как на шарпе работать с камерой :)

    http://alexmogurenko.com/blog/programming/windows-mobile-capturing-video-from-camera-c/

  • Вячеслав Said:

    Очень нужна помощь в написании программы, которая делает фотоснимок. Если кто-нибудь прочтёт мой коментарий в этой старой статье и сможет помочь, напишите плз в icq: 330-112-063

Comments RSS Feed   TrackBack URL

Leave a comment

Please leave these two fields as-is:
MMCIS investments: прибыльное вложение денег. ; новые фильмы. смотреть онлайн бесплатно ; Аська без смс , шаги. ; скачать Аську на телефон нокиа, телефоны и аксессуары . ; беленый дуб , разумные цены.

top