2012-06-07 25 views
5

Tôi đang cố gắng lật NSImage được tạo bằng biểu diễn NSImageBitmapRep. Sau khi đào một số (Flipping Quicktime preview & captureMirroring CIImage/NSImage) Tôi đã thử hai cách thông qua CIImage và áp dụng phép biến đổi tỷ lệ với -1 cho cả hai yếu tố.Flip NSImage trên cả hai trục

đầu tiên sử dụng CIImage imageByApplyingTransform:

NSBitmapImageRep *imgRep = ... 
    CGImageRef cgi = [imgRep CGImage]; 
    CIImage *cii = [CIImage imageWithCGImage:cgi]; 
    CGAffineTransform at = CGAffineTransformTranslate(CGAffineTransformMakeScale(-1, -1), 0, 0); 
    NSCIImageRep *ciiRep = [NSCIImageRep imageRepWithCIImage:[cii imageByApplyingTransform:at]]; 

    NSImage *img = [[[NSImage alloc] init] autorelease]; 
    [img addRepresentation:ciiRep]; 
    [self.ivImage setImage:img]; 

sau đó sử dụng một bộ lọc CIAffineTransform:

NSBitmapImageRep *imgRep = ... 
    CGImageRef cgi = [imgRep CGImage]; 
    CIImage *cii = [CIImage imageWithCGImage:cgi]; 
    CIFilter *f = [CIFilter filterWithName:@"CIAffineTransform"]; 
    NSAffineTransform *t = [NSAffineTransform transform]; 
    [t scaleXBy:1.0 yBy:1.0]; 
    //[t translateXBy:width yBy:0]; 
    [f setValue:t forKey:@"inputTransform"]; 
    [f setValue:cii forKey:@"inputImage"]; 
    CIImage *cii2 = [f valueForKey:@"outputImage"]; 
    NSCIImageRep *ciiRep = [NSCIImageRep imageRepWithCIImage:cii2]; 

    NSImage *img = [[[NSImage alloc] init] autorelease]; 
    [img addRepresentation:ciiRep]; 
    [self.ivImage setImage:img]; 

Cả hai cách tạo ra một hình ảnh trống. Tôi cũng đã cố gắng dịch các hình ảnh, trong trường hợp nó được ra khỏi màn hình vì -1 quy mô, nhưng vô ích. Nếu tôi sử dụng các giá trị dương cho việc chia tỷ lệ, tôi có thể thấy rằng phép biến đổi được áp dụng đúng.

self.ivImage là một NSImageView. Tôi muốn một NSImage thực tế được lật, do đó, áp dụng một chuyển đổi cho NSImageView không phải là một tùy chọn.

Đây là 32 bit, Xcode 4.3.2 trên Lion.

Trả lời

7

Bạn nên bắt đầu NSImage với kích thước.

Hiển thị nỗ lực của bạn với bản dịch, vì đó là cách phù hợp. Thông thường, nó dễ dàng nhất để dịch đầu tiên và sau đó quy mô. Đoạn mã của bạn dường như có dấu vết di truyền của các nỗ lực dịch, nhưng chúng không đúng. Bạn dịch bởi 0,0 trong một trường hợp và chiều rộng, 0 trong một trường hợp khác. Ngoài ra, trong đoạn mã thứ hai của bạn, bạn đang mở rộng bằng 1,1 (tích cực), do đó, không lật.

Ngoài ra, có thể đơn giản hơn là chỉ tập trung vào hình ảnh mới có kích thước phù hợp, thiết lập biến đổi và vẽ hình đại diện. Tránh tất cả nội dung đó với CIImage.

NSBitmapImageRep *imgRep = ... 
NSImage* img = [[[NSImage alloc] initWithSize:NSMakeSize(imgRep.pixelsWide, imgRep.pixelsHigh)] autorelease]; 
[img lockFocus]; 
NSAffineTransform* t = [NSAffineTransform transform]; 
[t translateXBy:imgRep.pixelsWide yBy:imgRep.pixelsHigh]; 
[t scaleXBy:-1 yBy:-1]; 
[t concat]; 
[imgRep drawInRect:NSMakeRect(0, 0, imgRep.pixelsWide, imgRep.pixelsHigh)]; 
[img unlockFocus]; 
+0

Cảm ơn, mà làm việc ngay ra khỏi hộp! :) Và nó sạch hơn nhiều mà không có đường vòng qua CIImage! Các thử nghiệm của tôi với bản dịch và chia tỷ lệ dương được để lại để kiểm tra xem liệu việc chuyển đổi có được áp dụng hay không. – msohn

+0

Giải pháp hoàn hảo. Cảm ơn vì điều đó! –

5

Dù sao thì, tôi nghĩ nên đăng một hàm hoàn chỉnh. Đây là giải pháp của tôi dựa trên Ken gửi

- (NSImage *)flipImage:(NSImage *)image 
{ 
    NSImage *existingImage = image; 
    NSSize existingSize = [existingImage size]; 
    NSSize newSize = NSMakeSize(existingSize.width, existingSize.height); 
    NSImage *flipedImage = [[[NSImage alloc] initWithSize:newSize] autorelease]; 

    [flipedImage lockFocus]; 
    [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; 

    NSAffineTransform *t = [NSAffineTransform transform]; 
    [t translateXBy:existingSize.width yBy:existingSize.height]; 
    [t scaleXBy:-1 yBy:-1]; 
    [t concat]; 

    [existingImage drawAtPoint:NSZeroPoint fromRect:NSMakeRect(0, 0, newSize.width, newSize.height) operation:NSCompositeSourceOver fraction:1.0]; 

    [flipedImage unlockFocus]; 

    return flipedImage; 
} 
0

cho lật dọc

- (NSImage *)flipImageVertically:(NSImage *)inputImage { 

    NSImage *tmpImage; 
    NSAffineTransform *transform = [NSAffineTransform transform]; 

    NSSize dimensions = [inputImage size]; 
    NSAffineTransformStruct flip = {1.0, 0.0, 0.0, -1.0, 0.0, 
     dimensions.height}; 
    tmpImage = [[NSImage alloc] initWithSize:dimensions]; 
    [tmpImage lockFocus]; 
    [transform setTransformStruct:flip]; 
    [transform concat]; 
    [inputImage drawAtPoint:NSMakePoint(0,0) 
         fromRect:NSMakeRect(0,0, dimensions.width, dimensions.height) 
         operation:NSCompositeCopy fraction:1.0]; 
    [tmpImage unlockFocus]; 


    return [tmpImage autorelease]; 

} 

cho lật ngang

+ (NSImage *)flipImageHorizontally:(NSImage *)inputImage { 

    NSImage *tmpImage; 
    NSAffineTransform *transform = [NSAffineTransform transform]; 

    NSSize dimensions = [inputImage size]; 
    NSAffineTransformStruct flip = {-1.0, 0.0, 0.0, 1.0, 
     dimensions.width, 0.0 }; 
    tmpImage = [[NSImage alloc] initWithSize:dimensions]; 
    [tmpImage lockFocus]; 
    [transform setTransformStruct:flip]; 
    [transform concat]; 
    [inputImage drawAtPoint:NSMakePoint(0,0) 
         fromRect:NSMakeRect(0,0, dimensions.width, dimensions.height) 
         operation:NSCompositeCopy fraction:1.0]; 
    [tmpImage unlockFocus]; 

    return [tmpImage autorelease]; 

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