Учитывая следующее
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? (Включите кодировку, а также массив символов в виде необработанного растрового изображения)
Пример кода очень ценится.
Вам нужно будет использовать библиотеку для кодирования JPEG. Некоторые возможности Jpeglib независимой группы JPEG, stb_image
, или же DevIL.
Это пример кода, который я получил от моего друга.
Он использует структуру данных OpenCV Mat. Обратите внимание, что вы должны обеспечить массив данных без знака в cv::Mat
в непрерывной форме. cv::cvtColor
сделает свое дело (или, cv::Mat.clone
).
Обратите внимание, не используйте OpenCV imwrite
, Как и в настоящее время, imwrite
не проходит сертификацию Windows Store. Он использует несколько 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();
});
}