使用xamarin.forms将图像大小压缩为250kb,无需依赖服务

时间:2016-01-05 04:36:28

标签: c# xamarin xamarin.forms

我正在尝试将Xamarin.Forms中从相机拍摄的图像压缩到250kb大小。我找到了在依赖服务中做到这一点的方法,但我希望它没有依赖服务(纯xamarin.forms代码)。怎么可能呢。任何人都可以建议我最好的方法吗?

提前致谢

2 个答案:

答案 0 :(得分:17)

这是一项非常复杂的工作,因为您需要大量的图像处理知识。

最重要的是,重新发明轮子是一个不好的举动。

http://www.codeproject.com/Articles/83225/A-Simple-JPEG-Encoder-in-C

看一下上面只解决JPEG的代码项目;不要说TIFF,GIF,BMP等。

图像压缩涉及许多复杂的数学变换,如DCT和Huffman。

你需要整个大学学期来学习这些基础知识。

另一方面,明智地利用平台支持,您可以在一分钟内完成任务。

Windows Phone中的

BitmapEncoder

FileStream stream = new FileStream("new.jpg", FileMode.Create);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 30;
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(stream);
Android中的

位图

using (System.IO.Stream stream = System.IO.File.Create(targetFile))
{
    bitmap.Compress(Bitmap.CompressFormat.Jpeg, 30, stream);
}
iOS中的

UIImage

NSData data = image.AsJPEG(0.3);
.NET框架中的

位图

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
ImageCodecInfo codec = codecs.First(t => t.FormatID == ImageFormat.Jpeg.Guid);
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, 30L);
bitmap.Save("output.jpg", codec, parameters);

答案 1 :(得分:3)

我也有同样的问题。请检查此处,因为我相信您会找到解决方案。

https://xamarincodes.com/2020/04/05/image-compression-in-xamarin-forms/

我使用Xam.Plugin.Media-设置压缩质量以拍摄照片并进行压缩。

这是一个样本

private async void cmdCameraPhotograph_Clicked(object sender, EventArgs e)
    {
        if (CrossMedia.Current.IsTakePhotoSupported)
        {
            var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
            {
                Directory = "Photographs",
                SaveToAlbum = true,
                CompressionQuality = 40,
                CustomPhotoSize = 35,
                PhotoSize = PhotoSize.MaxWidthHeight,
                MaxWidthHeight = 2000,
                DefaultCamera = CameraDevice.Rear
            }).ConfigureAwait(true);

            if (file != null)
            {
                
            }
        }
        else
        {
            await DisplayAlert("Not Supported", "Your device does not support this feature.", "OK. Understood")
                .ConfigureAwait(true);
        }
    }

您也可以从图库中获取文件

var file = await CrossMedia.Current.PickPhotoAsync(new PickMediaOptions
            {
                CompressionQuality = 40,
                CustomPhotoSize = 35,
                PhotoSize = PhotoSize.MaxWidthHeight,
                MaxWidthHeight = 2000
            }).ConfigureAwait(true);