2010-03-10 26 views
7

Tôi đang cố gắng định lại kích thước hình ảnh được tải từ đĩa - JPG hoặc PNG (Tôi không biết định dạng khi tải) - và sau đó lưu lại vào đĩa.Thay đổi kích thước và lưu hình ảnh vào đĩa trong Monotouch

Tôi có mã sau mà tôi đã cố gắng chuyển từ mục tiêu-c, tuy nhiên tôi đã bị kẹt ở phần cuối cùng. Original Objective-C.

Đây có thể không phải là cách tốt nhất để đạt được những gì tôi muốn làm - mọi giải pháp đều tốt cho tôi.

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); 
    */ 
} 

Trả lời

20

Trong MonoTouch sắp tới chúng tôi sẽ có một phương pháp quy mô, đây là thực hiện nó trong 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;   
    } 

điều chỉnh được tái sử dụng bên ngoài của 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;   
    } 
0

Để có được một UIImage từ bối cảnh tất cả các bạn cần làm là:

UIImage* result = UIImage.FromImage(context.ToImage()); 
1
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; 
    } 
Các vấn đề liên quan