2010-03-10 107 views
7

我試圖調整從磁盤加載圖像 - JPG或PNG(我不知道格式,當我加載) - ,然後再保存到磁盤調整大小並保存到磁盤圖像中的MonoTouch

我已經得到了下面的代碼,我嘗試從objective-c移植過來,但是我在最後的部分卡住了。 Original Objective-C

這可能不是實現我想要做的最好的方式 - 任何解決方案對我來說都很好。

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

回答

20

在即將到來的MonoTouch,我們將有一個規模的方法,這是其在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;   
    } 

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

您可以通過上下文中的UIImage所有你需要做的是:

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; 
    } 
相關問題