UWP 文件缩略图保存在 SQL 服务器数据库中
UWP file thumbnail save in SQL Server database
我有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 服务器,当我得到它们时从我的网站 api 稍后我想使用它们(播放音频或视频并显示图像)并且在所有 3 种类型中我需要一个缩略图图像来显示在我的 gridview 中。
您的问题出在 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[] { };
}
}
我有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 服务器,当我得到它们时从我的网站 api 稍后我想使用它们(播放音频或视频并显示图像)并且在所有 3 种类型中我需要一个缩略图图像来显示在我的 gridview 中。
您的问题出在 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[] { };
}
}