Сохранение миниатюры файла UWP в базе данных SQL Server - PullRequest
0 голосов
/ 08 июля 2019

У меня есть 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.

1 Ответ

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

Ваша проблема была в GetBytesForImageAsync методе.Полученные byte[] данные неверны.Пожалуйста, попробуйте следующий код:

public static async Task<byte[]> GetBytesForImageAsync(StorageFile mediafile)
{
        byte[] bts;
        using (var imgSource = await mediafile.GetScaledImageAsThumbnailAsync(ThumbnailMode.VideosView, Constants._thumbnailReqestedSize, ThumbnailOptions.UseCurrentScale))
        {
            if (!(imgSource is null))
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    await imgSource.AsStream().CopyToAsync(stream);
                    bts = stream.ToArray();
                    return bts;
                }
            }
            else
                return new byte[] { };
        }
}
...