Знаете ли вы, почему UWP C # BitmapEncored выдает исключение «Указанное приведение неверно» для моего Guid? - PullRequest
0 голосов
/ 05 июля 2019

Я разрабатываю приложение на C # / UWP, которое открывает изображения, модифицирует их и сохраняет их. Приложение поддерживает несколько расширений файлов, и у меня есть проблема со всеми форматами файлов. В этом случае я использую тестовые изображения PNG и JPG в качестве примера.

Я использую класс BitmapDecoder в приложении UWP для открытия изображений с использованием следующего кода.

using (IRandomAccessStreamWithContentType imageFileStream = await imageStorageFile.OpenReadAsync())
{
    BitmapDecoder bitmapDecoder = await BitmapDecoder.CreateAsync(imageFileStream);
    PixelDataProvider pixelDataProvider = await bitmapDecoder.GetPixelDataAsync();
    pixelData = pixelDataProvider.DetachPixelData();
    encoderGuid = bitmapDecoder.DecoderInformation.CodecId;
}

Кодировщик возвращает Guid, как ‘9456a480-e88b-43ea-9e73-0b2d9b71b1ca’ для тестового изображения PNG, и я подозревал, что его можно было напрямую использовать в классе Encryptor, который я использую для записи. Моя программа изменяет изображение и сохраняет его в другое изображение в том же формате, для которого я использую BitmapEncoder.

using (IRandomAccessStream imageFileStream = await imageStorageFile.OpenAsync(FileAccessMode.ReadWrite))
{
    BitmapEncoder bitmapEncoder = await BitmapEncoder.CreateAsync(encoderGuid, imageFileStream);
    bitmapEncoder.SetPixelData(bitmapPixelFormat, bitmapAlphaMode, pixelWidth, pixelHeight, dpiX, dpiY, pixelData);
    await bitmapEncoder.FlushAsync();
}

На этом этапе в методе BitmapEncoder.CreateAsync появляется ошибка «Указанное преобразование недопустимо», поскольку оно не принимает Guid, ранее созданный декодером.

Guid не соответствует ни одному из статических идентификаторов кодировщика.

BitmapEncoder.PngEncoderId
BitmapEncoder.JpegEncoderId
BitmapEncoder.JpegXREncoderId
BitmapEncoder.TiffEncoderId
BitmapEncoder.BmpEncoderId
BitmapEncoder.GifEncoderId

Я могу ввести эти статические Guid без исключения «Указанный приведен неверный». Хотя, когда я использовал BitmapEncoder.PngEncoderId, программа сохранила изображение в формате png с шумом только пикселя.

Есть идеи, что я делаю не так, пожалуйста? Любая помощь приветствуется. Спасибо!

1 Ответ

0 голосов
/ 08 июля 2019

@ Йерун Мостерт был на правильном пути.Вы можете конвертировать его вручную.

Например,

if (bitmapDecoder.DecoderInformation.CodecId == BitmapDecoder.BmpDecoderId)
{
     encoderGuid = BitmapEncoder.BmpEncoderId;
}
else if (bitmapDecoder.DecoderInformation.CodecId == BitmapDecoder.GifDecoderId)
{
     encoderGuid = BitmapEncoder.GifEncoderId;
}
else if (bitmapDecoder.DecoderInformation.CodecId == BitmapDecoder.JpegDecoderId)
{
     encoderGuid = BitmapEncoder.JpegEncoderId;
}
else if (bitmapDecoder.DecoderInformation.CodecId == BitmapDecoder.JpegXRDecoderId)
{
     encoderGuid = BitmapEncoder.JpegXREncoderId;
}
else if (bitmapDecoder.DecoderInformation.CodecId == BitmapDecoder.PngDecoderId)
{
     encoderGuid = BitmapEncoder.PngEncoderId;
}
else if (bitmapDecoder.DecoderInformation.CodecId == BitmapDecoder.TiffDecoderId)
{
     encoderGuid = BitmapEncoder.TiffEncoderId;
}
else
{
      throw new NotSupportedException("unknown Codec");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...