Cambiar el tamaño y guardar una imagen en el disco en MonoTouch
-
19-09-2019 - |
Pregunta
Estoy tratando de cambiar el tamaño de una imagen cargada desde el disco - un archivo JPG o PNG (no sé el formato cuando lo cargo) - y luego volver a guardarlo en el disco .
Tengo el siguiente código, que he tratado de puerto de Objective-C, sin embargo me he quedado atrapado en las últimas partes. original Objective-C .
Esto puede no ser la mejor manera de lograr lo que quiero hacer -. Ninguna solución es bien para mí
int width = 100;
int height = 100;
using (UIImage image = UIImage.FromFile(filePath))
{
CGImage cgimage = image.CGImage;
CGImageAlphaInfo alphaInfo = cgimage.AlphaInfo;
if (alphaInfo == CGImageAlphaInfo.None)
alphaInfo = CGImageAlphaInfo.NoneSkipLast;
CGBitmapContext context = new CGBitmapContext(IntPtr.Zero,
width,
height,
cgimage.BitsPerComponent,
4 * width,
cgimage.ColorSpace,
alphaInfo);
context.DrawImage(new RectangleF(0, 0, width, height), cgimage);
/*
Not sure how to convert this part:
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage* result = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap); // ok if NULL
CGImageRelease(ref);
*/
}
Solución
En la próxima MonoTouch tendremos un método de escala, esto es su aplicación en UIImage.cs:
public UIImage Scale (SizeF newSize)
{
UIGraphics.BeginImageContext (newSize);
var context = UIGraphics.GetCurrentContext ();
context.TranslateCTM (0, newSize.Height);
context.ScaleCTM (1f, -1f);
context.DrawImage (new RectangleF (0, 0, newSize.Width, newSize.Height), CGImage);
var scaledImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return scaledImage;
}
Ajustado para ser reutilizado fuera de MonoTouch:
public static UIImage Scale (UIImage source, SizeF newSize)
{
UIGraphics.BeginImageContext (newSize);
var context = UIGraphics.GetCurrentContext ();
context.TranslateCTM (0, newSize.Height);
context.ScaleCTM (1f, -1f);
context.DrawImage (new RectangleF (0, 0, newSize.Width, newSize.Height), source.CGImage);
var scaledImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return scaledImage;
}
Otros consejos
public static UIImage EditPhoto(int iMode, UIImage origImg)
{
SizeF newSize;
if (iMode == 1 || iMode == 2)
newSize = new SizeF(origImg.Size.Height, origImg.Size.Width);
else
newSize = origImg.Size;
UIGraphics.BeginImageContext(newSize);
CGContext ctx = UIGraphics.GetCurrentContext();
switch (iMode)
{
case 1: // Rotate counter-clockwise 90 degrees
ctx.TranslateCTM(origImg.Size.Height, origImg.Size.Width);
ctx.ScaleCTM(1f, -1f);
ctx.RotateCTM(1.57079633f); // angle is in radians
break;
case 2: // Rotate clockwise 90 degrees
ctx.ScaleCTM(1f, -1f);
ctx.RotateCTM(-1.57079633f); // angle is in radians
break;
case 3: // Flip vertical
// Do nothing. The image comes out flipped vertically because Core Graphics / OpenTK uses cartesian coordinates
break;
case 4: // Flip horizontal
ctx.TranslateCTM(newSize.Width, newSize.Height);
ctx.ScaleCTM(-1f, -1f);
break;
default: // Return unchanged image
ctx.TranslateCTM(0, origImg.Size.Height);
ctx.ScaleCTM(1f, -1f);
break;
}
ctx.DrawImage(new RectangleF(0, 0, origImg.Size.Width, origImg.Size.Height), origImg.CGImage);
UIImage resImg = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return resImg;
}
Para obtener una UIImage de contexto todo lo que tiene que hacer es:
UIImage* result = UIImage.FromImage(context.ToImage());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow