在此代码中,我首先从Windows手机照片库中选择图像然后压缩它以便我可以上传它。但是我在压缩时面临一些问题,因为当我在BitmapEncoder中使用FlushAsync时,原始final不会被覆盖并发生异常。这是我的代码
从图书馆中挑选图片
ImagePath = string.Empty;
FileOpenPicker filePicker = new FileOpenPicker();
filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
filePicker.ViewMode = PickerViewMode.Thumbnail;
// Filter to include a sample subset of file types
filePicker.FileTypeFilter.Clear();
filePicker.FileTypeFilter.Add(".bmp");
filePicker.FileTypeFilter.Add(".png");
filePicker.FileTypeFilter.Add(".jpeg");
filePicker.FileTypeFilter.Add(".jpg");
filePicker.PickMultipleFilesAndContinue();
view.Activated += viewActivated;
解码和压缩图像
FileOpenPickerContinuationEventArgs args = args1 as FileOpenPickerContinuationEventArgs;
if (args != null)
{
try
{
if (args.Files.Count == 0) return;
view.Activated -= viewActivated;
userLoginResponse = await DataManager.GetLoginResponseAsync();
for (int no = 0; (no < args.Files.Count && no < 4); no++)
{
StorageFile storageFile = args.Files[no];
var stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite);
var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
await bitmapImage.SetSourceAsync(stream);
var decoder = await BitmapDecoder.CreateAsync(stream);
PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
var data = pixelData.DetachPixelData();
BitmapPropertySet propertySet = new BitmapPropertySet();
BitmapTypedValue qualityValue = new BitmapTypedValue(1.0, Windows.Foundation.PropertyType.Single);
propertySet.Add("ImageQuality", qualityValue);
BitmapEncoder be = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);
be.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Straight, 480, 480, 50, 50, data);
await be.FlushAsync();
任何人都可以建议解决这个问题。 提前致谢
答案 0 :(得分:3)
我使用诺基亚成像SDK来实现这一目标。只需将SDK添加到您的解决方案using NuGet. 然后包括
using Lumia.Imaging;
在你的代码文件中。之后,您可以使用以下代码从StorageFile
读取图像数据并将其压缩为byte[]
,然后您可以将其上传到服务器:
byte[] compressedImageBytes = null;
IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read); // "file" being the StorageFile from your FileOpenPicker
if (file.Name.ToLower().EndsWith(".jpg") || file.Name.ToLower().EndsWith(".jpeg"))
{
using (StreamImageSource source = new StreamImageSource(fileStream.AsStreamForRead()))
{
IFilterEffect effect = new FilterEffect(source);
using (JpegRenderer renderer = new JpegRenderer(effect))
{
renderer.Quality = 0.7; // higher value means better quality
IBuffer buffer = await renderer.RenderAsync();
Windows.Security.Cryptography.CryptographicBuffer.CopyToByteArray(buffer, out compressedImageBytes);
}
}
}}
if (compressedImageBytes != null)
{
//you can upload or safe the byte-array of the compressed image
}
答案 1 :(得分:0)
您正在尝试在应用程序中选择Windows Phone照片库中的照片,压缩它们并回写到Windows Phone库吗?
我从您的应用程序中了解到,您只能选择从Windows Phone的照片库中读取图片。这样,您就无法更改Windows Phone照片库中的原始图像。
答案 2 :(得分:0)
虽然已经晚了但我认为问题是多次使用流对象。首先,您使用流创建BitmapImage,然后使用流创建解码器,然后在位图编码器中再次使用流。 有趣的是,Windows Phone 8.1流对象在首次使用后变为null。所以你可以在使用之前克隆流对象。在你的情况下你可以克隆2次解码器&amp;编码器喜欢 var streamDecoder = steam.Clone(); var streamEncoder = stream.Clone()。并在解码器和编码器中使用它们。我认为问题会像这样解决。