0

鉴于以下

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

// 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 数组是原始位图形式)

非常感谢代码示例。

4

2 回答 2

0

您需要使用库来对 JPEG 进行编码。一些可能性是Independent JPEG Group 的 jpeglibstb_imageDevIL

于 2012-11-14T16:23:13.250 回答
0

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

它使用 OpenCV 的 Mat 数据结构。请注意,您需要确保其中的 unsigned char 数据数组cv::Mat是连续形式的。cv::cvtColor会成功的(或,cv::Mat.clone)。

请注意,不要使用 OpenCV 的imwrite. 截至撰写本文时,imwrite未通过 Windows 应用商店认证测试。它使用了几个 API,这在 WinRT 中是被禁止的。

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();
    });
}
于 2012-11-16T09:16:14.513 回答