Xamarin формирует изображение андроида не сжимается

Я работаю над проектом xamarin forms. Я беру изображения из галереи и загружаю их на сервер. Мой back-end – это синтаксический анализ, в котором мы не можем загружать файлы размером более 1 МБ. Итак, я пытаюсь сжать изображение так, чтобы каждый раз, когда размер изображения меньше 1 МБ. Ниже приводится мой код: –

protected override async void OnActivityResult (int requestCode, Result resultCode, Intent intent) { if (resultCode == Result.Canceled) return; try { var mediafile = await intent.GetMediaFileExtraAsync (Forms.Context); // get byte[] from file stream byte[] byteData = ReadFully (mediafile.GetStream ()); byte[] resizedImage = ResizeAndCompressImage (byteData, 60, 60, mediafile); var imageStream = new ByteArrayContent (resizedImage); imageStream.Headers.ContentDisposition = new ContentDispositionHeaderValue ("attachment") { FileName = Guid.NewGuid () + ".Png" }; var multi = new MultipartContent (); multi.Add (imageStream); HealthcareProfessionalDataClass lDataClass = HealthcareProfessionalDataClass.Instance; lDataClass.Thumbnail = multi; App.mByteArrayOfImage = byteData; MessagingCenter.Send<IPictureTaker,string> (this, "picturetaken", mediafile.Path); } catch (InvocationTargetException e) { e.PrintStackTrace (); } catch (Java.Lang.Exception e) { e.PrintStackTrace (); } } public static byte[] ReadFully (System.IO.Stream input) { using (var ms = new MemoryStream ()) { input.CopyTo (ms); return ms.ToArray (); } } public static byte[] ResizeAndCompressImage (byte[] imageData, float width, float height, MediaFile file) { try { // Load the bitmap var options = new BitmapFactory.Options (); options.InJustDecodeBounds = true; options.InMutable = true; BitmapFactory.DecodeFile (file.Path, options); // Calculate inSampleSize options.InSampleSize = calculateInSampleSize (options, (int)width, (int)height); // Decode bitmap with inSampleSize set options.InJustDecodeBounds = false; var originalBitMap = BitmapFactory.DecodeByteArray (imageData, 0, imageData.Length, options); var resizedBitMap = Bitmap.CreateScaledBitmap (originalBitMap, (int)width, (int)height, false); if (originalBitMap != null) { originalBitMap.Recycle (); originalBitMap = null; } using (var ms = new MemoryStream ()) { resizedBitMap.Compress (Bitmap.CompressFormat.Png, 0, ms); if (resizedBitMap != null) { resizedBitMap.Recycle (); resizedBitMap = null; } return ms.ToArray (); } } catch (Java.Lang.Exception e) { e.PrintStackTrace (); return null; } } public static int calculateInSampleSize (BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image int height = options.OutHeight; int width = options.OutWidth; int inSampleSize = 16; if (height > reqHeight || width > reqWidth) { int halfHeight = height / 2; int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; } 

Но проблема в том, что мой образ не сжат. Я не могу загрузить изображение размером = 2 МБ, и я хочу загрузить изображения размером не менее 30 МБ. Также я заметил, что calculateInSampleSize всегда возвращает 16 как inSampleSize, который по умолчанию один.

Пожалуйста, дайте мне знать, есть ли какие-либо проблемы в моем коде.

Это кажется очень сложным и запутанным способом сделать это. Вот более краткий пример, который поможет вам изменить размеры ваших изображений:

 protected override void OnActivityResult(int requestCode, Result resultCode, Android.Content.Intent data) { base.OnActivityResult(requestCode, resultCode, data); var stream = this.Resize(data.Data, 60, 60); // Send the stream to Parse } private Stream Resize(Android.Net.Uri uri, float maxWidth, float maxHeight) { var scale = 1; using (var rawStream = this.ContentResolver.OpenInputStream(f)) using (var options = new BitmapFactory.Options { InJustDecodeBounds = true }) { BitmapFactory.DecodeStream(rawStream, null, options); while(options.OutWidth / scale / 2 > maxWidth || options.OutHeight / scale / 2 > maxHeight) { scale *= 2; } } using (var options = new BitmapFactory.Options { InSampleSize = scale }) using (var bitmap = f.GetBitmap(options)) { var memoryStream = new MemoryStream(); bitmap.Compress(Bitmap.CompressFormat.Png, 0, memoryStream); memoryStream.Position = 0; return memoryStream; } } 

Что касается того, почему вы видите InSampleSize = 16 , я предполагаю, что высота или ширина вашего изображения меньше 1920 (это 60 * 2 * 16 ), и поскольку вы используете && в цикле while, большая проверка для этой стороны терпит неудачу и Таким образом, вы никогда не входите в тело.

Кроме того, если вы хотите создавать меньшие изображения, сжимаете их, поскольку Jpeg намного лучше подходит, чем использовать png.

Intereting Posts
Android Key Store API 23, используйте setUserAuthenticationRequired без сканера отпечатков пальцев Отмена десериализации Google Analytics с помощью Gson возвращает LinkedTreeMap Android OpenCV с использованием функций MatOfKeyPoint и feature2d Как автоматически создавать и развертывать на нескольких устройствах Android в Intellij OnCreate не вызывается, когда экран вращается – Android Java – просмотр случайных строк Получение прямого IP-адреса WiFi моего устройства Отладчик Android скрывает локальную переменную RecyclerView – Как сгладить прокрутку до вершины позиции на определенной позиции? Не удалось выполнить перезагрузку Android Repo Создание ключа выпуска для Facebook SDK 3.0 на Android Проверка орфографии и студия Android / IntelliJ Idea Максимальный размер встроенной кучи на Android? Почему GetServerAuthCodeResult устарел? Как я могу сделать что-то эквивалентное в установленном приложении? Статус Asynctask всегда показывает запуск