У меня есть 3 вида файлов для хранения: фотографии, видео и аудио, и я хочу сохранить их в базе данных в виде байтового массива.Я пытался это сделать, и это сработало, но когда я конвертировал их обратно из byte[]
в StorageFile
, а затем пытался получить их миниатюру, все, что я получал, - это белый значок файла вместо правильного миниатюрного изображения.
StorageFile
до Byte[]
:
public static async Task<byte[]> GetBytesAsync(StorageFile file)
{
byte[] fileBytes = null;
if (file is null)
{
return null;
}
using (var stream = await file.OpenReadAsync())
{
fileBytes = new byte[stream.Size];
using (var reader = new DataReader(stream))
{
await reader.LoadAsync((uint)stream.Size);
reader.ReadBytes(fileBytes);
}
}
return fileBytes;
}
byte[]
до StoragFile
:
public static async Task<StorageFile> GetStorageFileAsync(byte[] byteArray, string fileName)
{
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await storageFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
await FileIO.WriteBytesAsync(sampleFile, byteArray);
return sampleFile;
}
Итак, я сделал новую колонку в моей БД и подумал, что могусохранить миниатюру в нем отдельно в виде байта [].
public static async Task<byte[]> GetBytesForImageAsync(StorageFile mediafile)
{
WriteableBitmap bb = null;
using (var imgSource = await mediafile.GetScaledImageAsThumbnailAsync(ThumbnailMode.VideosView, Constants._thumbnailReqestedSize, ThumbnailOptions.UseCurrentScale))
{
if (!(imgSource is null))
{
bb = new WriteableBitmap(Convert.ToInt32(imgSource.OriginalWidth), Convert.ToInt32(imgSource.OriginalHeight));
await bb.SetSourceAsync(imgSource);
}
}
return bb is null ? new byte[] { } : bb.PixelBuffer.ToArray();
}
Я пытался сделать это с BitmapImage
, а также с WriteableBitmapImage
, но ничего не работает, так как я получаю "исключение компонента не найдено", когдаЯ пытаюсь вернуть миниатюру из этого байта []
С растровым изображением:
public async static Task<BitmapImage> GetImageFromBytesAsync(byte[] bytes)
{
var image = new BitmapImage();
using (var stream = new InMemoryRandomAccessStream())
{
await stream.WriteAsync(bytes.AsBuffer());
stream.Seek(0);
await image.SetSourceAsync(stream);
}
return image;
}
С writeableBitmap
:
public static async Task<WriteableBitmap> GetImageFromBytesAsync(byte[] bytes)
{
using (var image = bytes.AsBuffer().AsStream().AsRandomAccessStream())
{
// decode image
var decoder = await BitmapDecoder.CreateAsync(image);
image.Seek(0);
// create bitmap
var output = new WriteableBitmap((int)decoder.PixelHeight, (int)decoder.PixelWidth);
await output.SetSourceAsync(image);
return output;
}
}
В конечном итоге моя цель - выбрать аудио, видео или фото файлы с локального устройства с FileOpenPicker (это то, что я делаю в настоящее время, а также), а затем сохранить эти файлы на SQL Server, и когда я получу их позже из моего веб-API, я хочу использовать их (воспроизводить аудио или видеои отображать изображения), и во всех 3 типах мне нужно уменьшенное изображение, чтобы показать в моем gridview.