从库中选择图像并压缩Windows Phone 8.1

时间:2015-04-09 06:08:37

标签: c# windows-phone-8 windows-runtime windows-phone-8.1

在此代码中,我首先从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();

任何人都可以建议解决这个问题。 提前致谢

3 个答案:

答案 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()。并在解码器和编码器中使用它们。我认为问题会像这样解决。