Как изменить размер изображений в xamarin.forms?

#xamarin #xamarin.forms #xamarin.android #xamarin.ios

Вопрос:

Я работаю над xamarin.forms. Я должен выбрать изображения из галереи, а затем изменить их размер, а затем загрузить их на сервер. Но я не знаю, как я могу изменить размер выбранного изображения в заданном конкретном размере? Пожалуйста, сообщите мне, как я могу это сделать?

Комментарии:

1. смотрите этот пост: forums.xamarin.com/discussion/37681/…

2. Хотя вам нужно немного перевести с немецкого 🙂

3. Привет, Джейсон, Там используется растровое изображение, но как я могу использовать растровое изображение в xamarin.forms. Какую ссылку мне нужно использовать для растрового изображения в xamarin.forms?

4. прочтите заметки Фредди в «пост». Он написал его как общий проект — ссылка на растровое изображение находится в части кода для Android, а не для iOS. Если вы не хотите использовать общий проект, вам потребуется провести рефакторинг для использования проектов и ПРИЛОЖЕНИЙ, специфичных для платформы.

Ответ №1:

Это можно использовать с потоком (если вы используете медиа-плагин https://github.com/jamesmontemagno/MediaPlugin) или стандартные массивы байтов.

 // If you already have the byte[]
byte[] resizedImage = await CrossImageResizer.Current.ResizeImageWithAspectRatioAsync(originalImageBytes, 500, 1000);

// If you have a stream, such as:
// var file = await CrossMedia.Current.PickPhotoAsync(options);
// var originalImageStream = file.GetStream();
byte[] resizedImage = await CrossImageResizer.Current.ResizeImageWithAspectRatioAsync(originalImageStream, 500, 1000);
 

Комментарии:

1. не уверен, что устарел, но CrossImageResizer не является частью библиотеки, о которой вы упомянули

Ответ №2:

Я пробовал использовать CrossImageResizer.Current... , но не нашел его в Media Plugin . Вместо этого я нашел опцию под названием MaxWidthHeight , которая работала только в том случае, если вы также добавили PhotoSize = PhotoSize.MaxWidthHeight опцию.

например :

  var file = await CrossMedia.Current.PickPhotoAsync(new PickMediaOptions() { PhotoSize = PhotoSize.MaxWidthHeight, MaxWidthHeight = 600 });
 var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions { PhotoSize = PhotoSize.MaxWidthHeight, MaxWidthHeight = 600 });
 

Ответ №3:

К сожалению, не существует хорошего кросс-платформенного средства изменения размера изображений (которое я нашел во время этого поста). Обработка изображений на самом деле не была предназначена для работы в кросс-платформенной среде для iOS и Android. Это намного быстрее и чище выполнять на каждой платформе, используя код для конкретной платформы. Вы можете сделать это с помощью внедрения зависимостей и службы зависимостей (или любой другой службы или IOC).

AdamP дает отличный ответ о том, как изменить размер изображения для этой платформы

Комментарии:

1. Не могли бы вы добавить код сюда? Потому что ссылки/страницы могут со временем исчезнуть ..

Ответ №4:

Вот код, взятый по ссылке выше.

iOS

 public class MediaService : IMediaService
{

    public byte[] ResizeImage(byte[] imageData, float width, float height)
    {

        UIImage originalImage = ImageFromByteArray(imageData);

        var originalHeight = originalImage.Size.Height;
        var originalWidth = originalImage.Size.Width;

        nfloat newHeight = 0;
        nfloat newWidth = 0;

        if (originalHeight > originalWidth)
        {
            newHeight = height;
            nfloat ratio = originalHeight / height;
            newWidth = originalWidth / ratio;
        }
        else 
        {
            newWidth = width;
            nfloat ratio = originalWidth / width;
            newHeight = originalHeight / ratio;
        }

        width = (float)newWidth;
        height = (float)newHeight;

        UIGraphics.BeginImageContext(new SizeF(width, height));
        originalImage.Draw(new RectangleF(0, 0, width, height));
        var resizedImage = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();

        var bytesImagen = resizedImage.AsJPEG().ToArray();
        resizedImage.Dispose();
        return bytesImagen;
   }          
}
 

Android

 public class MediaService : IMediaService
{

    public byte[] ResizeImage(byte[] imageData, float width, float height)
    {
        // Load the bitmap 
        BitmapFactory.Options options = new BitmapFactory.Options();// Create object of bitmapfactory's option method for further option use
        options.InPurgeable = true; // inPurgeable is used to free up memory while required
        Bitmap originalImage = BitmapFactory.DecodeByteArray(imageData, 0, imageData.Length, options);

        float newHeight = 0;
        float newWidth = 0;

        var originalHeight = originalImage.Height;
        var originalWidth = originalImage.Width;

        if (originalHeight > originalWidth)
        {
            newHeight = height;
            float ratio = originalHeight / height;
            newWidth = originalWidth / ratio;
        }
        else 
        {
            newWidth = width;
            float ratio = originalWidth / width;
            newHeight = originalHeight / ratio;
        }

        Bitmap resizedImage = Bitmap.CreateScaledBitmap(originalImage, (int)newWidth, (int)newHeight, true);

        originalImage.Recycle();

        using (MemoryStream ms = new MemoryStream())
        {
            resizedImage.Compress(Bitmap.CompressFormat.Png, 100, ms);

            resizedImage.Recycle();

            return ms.ToArray();
        }
    }
 

WinPhone

 public class MediaService : IMediaService
{
    private MediaImplementation mi = new MediaImplementation();

    public byte[] ResizeImage(byte[] imageData, float width, float height)
    {
        byte[] resizedData;

        using (MemoryStream streamIn = new MemoryStream(imageData))
        {
            WriteableBitmap bitmap = PictureDecoder.DecodeJpeg(streamIn, (int)width, (int)height);

            float Height = 0;
            float Width = 0;

            float originalHeight = bitmap.PixelHeight;
            float originalWidth = bitmap.PixelWidth;

            if (originalHeight > originalWidth)
            {
                Height = height;
                float ratio = originalHeight / height;
                Width = originalWidth / ratio;
            }
            else
            {
                Width = width;
                float ratio = originalWidth / width;
                Height = originalHeight / ratio;
            }

            using (MemoryStream streamOut = new MemoryStream())
            {
                bitmap.SaveJpeg(streamOut, (int)Width, (int)Height, 0, 100);
                resizedData = streamOut.ToArray();
            }
        }
        return resizedData;
    }
}
 

РЕДАКТИРОВАТЬ: Если вы уже используете FFImageLoading в своем проекте, вы можете просто использовать его для своей платформы.

https://github.com/luberda-molinet/FFImageLoading

Комментарии:

1. Привет, хенда, в примере iOS отсутствует этот метод ImageFromByteArray(ImageData);.

2. Привет, Матас, в конце концов, я никогда не использовал эти методы, я разрабатывал только для Android, поэтому никогда не тестировал реализацию iOS. В итоге я использовал FFImageLoading из github.com/luberda-molinet/FFImageLoading поскольку у этого есть методы для изменения размера с достойным качеством вывода.

3. Попробуйте UIImage originalImage = UIImage. LoadFromData(NSData. Fromray(данные изображения));