鉴于以下内容
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数组是原始位图形式)
非常感谢代码示例。
答案 0 :(得分:0)
您需要使用库来编码JPEG。一些可能性是Independent JPEG Group's jpeglib,stb_image
或DevIL。
答案 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();
});
}