#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 в своем проекте, вы можете просто использовать его для своей платформы.
Комментарии:
1. Привет, хенда, в примере iOS отсутствует этот метод ImageFromByteArray(ImageData);.
2. Привет, Матас, в конце концов, я никогда не использовал эти методы, я разрабатывал только для Android, поэтому никогда не тестировал реализацию iOS. В итоге я использовал FFImageLoading из github.com/luberda-molinet/FFImageLoading поскольку у этого есть методы для изменения размера с достойным качеством вывода.
3. Попробуйте UIImage originalImage = UIImage. LoadFromData(NSData. Fromray(данные изображения));