记录NSImage中像素的亮度

时间:2015-03-06 17:35:30

标签: objective-c macos swift

我的目标是找到图像中每个像素的亮度,然后将其附加到数组中。我已经在网上看了(因为这是我的舒适区之外,但我认为这是我将学习的方式),并且发现了几个使用UIImage在IOS中获取Swift像素颜色的示例。不幸的是,相同的代码不能用于OS X,因为NSImage似乎没有像UIImage那样转换为CGImage。所以代码对我来说几乎没用。接下来我找到了this site,它提供了一段示例代码,用于查找和记录图像中每个像素的亮度。答对了!唯一的问题是它在Objective C中,我只是略微理解。在搜索失败之后,我开始尝试翻译Objective C代码。这是原始代码:

- (void)setupWithImage:(UIImage*)image {
UIImage * fixedImage = [image imageWithFixedOrientation];
self.workingImage = fixedImage;
self.mainImageView.image = fixedImage;

// Commence with processing!
[self logPixelsOfImage:fixedImage];
}

- (void)logPixelsOfImage:(UIImage*)image {
// 1. Get pixels of image
CGImageRef inputCGImage = [image CGImage];
NSUInteger width = CGImageGetWidth(inputCGImage);
NSUInteger height = CGImageGetHeight(inputCGImage);

NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;

UInt32 * pixels;
pixels = (UInt32 *) calloc(height * width, sizeof(UInt32));

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pixels, width, height,
                                           bitsPerComponent, bytesPerRow, colorSpace,
                                           kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), inputCGImage);

CGColorSpaceRelease(colorSpace);
CGContextRelease(context);

#define Mask8(x) ( (x) & 0xFF )
#define R(x) ( Mask8(x) )
#define G(x) ( Mask8(x >> 8 ) )
#define B(x) ( Mask8(x >> 16) )

// 2. Iterate and log!
NSLog(@"Brightness of image:");
UInt32 * currentPixel = pixels;
for (NSUInteger j = 0; j < height; j++) {
for (NSUInteger i = 0; i < width; i++) {
  UInt32 color = *currentPixel;
  printf("%3.0f ", (R(color)+G(color)+B(color))/3.0);
  currentPixel++;
}
printf("\n");
}

free(pixels);

#undef R
#undef G
#undef B

}

这是我的翻译代码:

func logPixelsOfImage(image: NSImage) {
    var inputCGImage: CGImageRef = image
    var width: UInt = CGImageGetWidth(inputCGImage)
    var height: UInt = CGImageGetHeight(inputCGImage)

    var bytesPerPixel: UInt = 4
    var bytesPerRow: UInt = bytesPerPixel * width
    var bitsPerComponent: UInt = 8

    var pixels: UInt32!
    //pixels = (UInt32 *) calloc(height * width, sizeof(UInt32));

    var colorSpace: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()
    var context: CGContextRef = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big) //Error: Use of unresolved identifier 'kCGImageAlphaPremultipliedLast' Second Error: Use of unresolved identifier 'kCGBitmapByteOrder32Big'

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), inputCGImage) // Error: 'Uint' is not convertible to 'CGFloat'

    /*
    #define Mask8(x) ( (x) & 0xFF )
    #define R(x) ( Mask8(x) )
    #define G(x) ( Mask8(x >> 8 ) )
    #define B(x) ( Mask8(x >> 16) )
 */
    println("Brightness of image:")
    var currentPixel: UInt32 = pixels
    for (var j : UInt = 0; j < height; j++) {
        for ( var i : UInt = 0; i < width; i++) {
            var color: UInt32 = currentPixel
            //printf("%3.0f ", (R(color)+G(color)+B(color))/3.0);
            currentPixel++
        }
        println("/n")
    }
    //free(pixels)

    /*
    #undef R
    #undef G
    #undeg B
*/
}

评论包含(a)代码提供的错误或(b)我不知道如何翻译的原始代码。

那么我的问题是什么? 有没有比Objective-C代码中显示的更好的方法来查找像素的亮度?如果是这样,你会怎么做?如果没有,我将如何完成原始代码的翻译?

谢谢 - 一个非常困惑且极度绝望的CodeIt。

0 个答案:

没有答案