2011-12-20 38 views
10

Tôi đang cố gắng tìm một công thức để tạo ra một màu xám mờ UIImage từ một màu PNG và alpha. Có những công thức có trong ObjC nhưng MonoTouch không ràng buộc các hàm CGRect vì vậy không chắc chắn làm thế nào để làm điều này. Ý tưởng nào?MonoTouch chuyển đổi màu UIImage thành alpha sang thang độ xám và mờ?

Dưới đây là một ví dụ về ObjC màu xám:

(UIImage *)convertImageToGrayScale:(UIImage *)image 
{ 
    // Create image rectangle with current image width/height 
    CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); 

    // Grayscale color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

    // Create bitmap content with current image size and grayscale colorspace 
    CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone); 

    // Draw image into current context, with specified rectangle 
    // using previously defined context (with grayscale colorspace) 
    CGContextDrawImage(context, imageRect, [image CGImage]); 

    // Create bitmap image info from pixel data in current context 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 

    // Create a new UIImage object 
    UIImage *newImage = [UIImage imageWithCGImage:imageRef]; 

    // Release colorspace, context and bitmap information 
    CGColorSpaceRelease(colorSpace); 
    CGContextRelease(context); 
    CFRelease(imageRef); 

    // Return the new grayscale image 
    return newImage; 
} 
+0

Tôi đã cố gắng để sử dụng chức năng này nhưng nó sẽ không làm việc với hình ảnh khác hơn 1.0 quy mô ... (ngắt trên võng mạc) – Jonny

Trả lời

13

MonoTouch không ràng buộc CGRect chức năng nên không chắc chắn làm thế nào để làm điều này.

Khi sử dụng MonoTouch CGRect được ánh xạ tới RectangleF. Rất nhiều phương thức mở rộng tồn tại nên ánh xạ tới mọi hàm được cung cấp bởi GCRect. Bạn không nên có bất kỳ vấn đề gì trong việc chuyển mã ObjectiveC bằng cách sử dụng chúng.

Nếu có điều gì đó bị thiếu, vui lòng điền vào báo cáo lỗi @http://bugzilla.xamarin.com và chúng tôi sẽ khắc phục sự cố càng sớm càng tốt (và cung cấp cách giải quyết khi có thể).

Có công thức nấu ăn ngoài kia trong ObjC nhưng MonoTouch

Nếu bạn có liên kết thì hãy sửa câu hỏi của bạn và thêm chúng. Điều đó sẽ làm cho nó dễ dàng hơn để giúp bạn :)

CẬP NHẬT

Dưới đây là một, line-by-line, C# dịch ví dụ của bạn. Dường như với công trình đối với tôi (và nó dễ dàng hơn để mắt hơn Objective-C ;-)

UIImage ConvertToGrayScale (UIImage image) 
    { 
     RectangleF imageRect = new RectangleF (PointF.Empty, image.Size); 
     using (var colorSpace = CGColorSpace.CreateDeviceGray()) 
     using (var context = new CGBitmapContext (IntPtr.Zero, (int) imageRect.Width, (int) imageRect.Height, 8, 0, colorSpace, CGImageAlphaInfo.None)) { 
      context.DrawImage (imageRect, image.CGImage); 
      using (var imageRef = context.ToImage()) 
       return new UIImage (imageRef); 
     } 
    } 
+0

HOẠT ĐỘNG TUYỆT VỜI! Tôi nghĩ rằng tôi có thể cần phải dành nhiều thời gian hơn để học các ví dụ ObjC vì rõ ràng nó có thể được thực hiện để trông dễ dàng (như bạn vừa làm). Cảm ơn –

+0

Vui vì nó hoạt động cho bạn :-) Hãy dành thời gian để chấp nhận câu trả lời (đánh dấu màu xanh lá cây bên dưới số phiếu) để cho phép người khác, tìm kiếm một câu hỏi tương tự, để xem câu trả lời có sẵn. – poupou

0

Tôi đã viết một cổng nguồn gốc của mờ và màu loại UIImage từ WWDC cho MonoTouch.

Mẫu mã cho màu và mờ:

UIColor tintColor = UIColor.FromWhiteAlpha (0.11f, 0.73f); 

UIImage yourImage; 
yourImage.ApplyBlur (20f /*blurRadius*/, tintColor, 1.8f /*deltaSaturationFactor*/, null); 
+0

Bạn chỉ nên đặt deltaSaturationFactor thành 0 – evya

Các vấn đề liên quan