将char数组保存为JPG for C ++ Windows Store App

时间:2012-11-14 16:02:38

标签: c++ windows-8 microsoft-metro

鉴于以下内容

  • char数组中的位图原始图像数据
  • 图像宽度和高度
  • 使用以下代码生成的std :: wstring中的路径wzAppDataDirectory

// Get a good path.
wchar_t wzAppDataDirectory[MAX_PATH];
wcscpy_s( wzAppDataDirectory, MAX_PATH, Windows::Storage::ApplicationData::Current->LocalFolder->Path->Data() );
wcscat_s( wzAppDataDirectory, MAX_PATH, (std::wstring(L"\\") + fileName).c_str() );

我们如何将图像保存为JPG? (包括编码以及char数组是原始位图形式)

非常感谢代码示例。

2 个答案:

答案 0 :(得分:0)

您需要使用库来编码JPEG。一些可能性是Independent JPEG Group's jpeglibstb_imageDevIL

答案 1 :(得分:0)

这是我从朋友处获得的示例代码。

它使用OpenCV的Mat数据结构。请注意,您需要确保cv::Mat中的unsigned char数据数组是连续的。 cv::cvtColor可以解决问题(或者,cv::Mat.clone)。

请注意,请勿使用OpenCV的imwrite截至目前撰写时,imwrite未通过Windows应用商店认证测试。它使用了几个在WinRT中禁止的API。

void SaveMatAsJPG(const cv::Mat& mat, const std::wstring fileName)
{
    cv::Mat tempMat;
    cv::cvtColor(mat, tempMat, CV_BGR2BGRA);

    Platform::String^ pathName = ref new Platform::String(fileName.c_str());

    task<StorageFile^>(ApplicationData::Current->LocalFolder->CreateFileAsync(pathName, CreationCollisionOption::ReplaceExisting)).
    then([=](StorageFile^ file)
    {
        return file->OpenAsync(FileAccessMode::ReadWrite);
    }).
    then([=](IRandomAccessStream^ stream)
    {
        return BitmapEncoder::CreateAsync(BitmapEncoder::JpegEncoderId, stream);
    }).
    then([=](BitmapEncoder^ encoder)
    {
        const Platform::Array<unsigned char>^ pixels = ref new Platform::Array<unsigned char>(tempMat.data, tempMat.total() * tempMat.channels());
        encoder->SetPixelData(BitmapPixelFormat::Bgra8, BitmapAlphaMode::Ignore, tempMat.cols , tempMat.rows, 96.0, 96.0, pixels);
        encoder->FlushAsync();
    });
}