2014-06-04 15 views

risposta

13

Ecco come ottenere un colore da un'immagine in una posizione tattile.

ho tradotto questa risposta: https://stackoverflow.com/a/12579413/359578

(Questo campione non fa controllo degli errori per nil)

func createARGBBitmapContext(inImage: CGImage) -> CGContext { 
    var bitmapByteCount = 0 
    var bitmapBytesPerRow = 0 

    //Get image width, height 
    let pixelsWide = CGImageGetWidth(inImage) 
    let pixelsHigh = CGImageGetHeight(inImage) 

    // Declare the number of bytes per row. Each pixel in the bitmap in this 
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and 
    // alpha. 
    bitmapBytesPerRow = Int(pixelsWide) * 4 
    bitmapByteCount = bitmapBytesPerRow * Int(pixelsHigh) 

    // Use the generic RGB color space. 
    let colorSpace = CGColorSpaceCreateDeviceRGB() 

    // Allocate memory for image data. This is the destination in memory 
    // where any drawing to the bitmap context will be rendered. 
    let bitmapData = malloc(bitmapByteCount) 

    // Create the bitmap context. We want pre-multiplied ARGB, 8-bits 
    // per component. Regardless of what the source image format is 
    // (CMYK, Grayscale, and so on) it will be converted over to the format 
    // specified here by CGBitmapContextCreate. 
    let context = CGBitmapContextCreate(bitmapData, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, CGImageAlphaInfo.PremultipliedFirst.rawValue) 

    // Make sure and release colorspace before returning 
    return context! 
} 

func getPixelColorAtLocation(point:CGPoint, inImage:CGImageRef) -> NSColor { 
    // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue 
    let context = self.createARGBBitmapContext(inImage) 

    let pixelsWide = CGImageGetWidth(inImage) 
    let pixelsHigh = CGImageGetHeight(inImage) 
    let rect = CGRect(x:0, y:0, width:Int(pixelsWide), height:Int(pixelsHigh)) 

    //Clear the context 
    CGContextClearRect(context, rect) 

    // Draw the image to the bitmap context. Once we draw, the memory 
    // allocated for the context for rendering will then contain the 
    // raw image data in the specified color space. 
    CGContextDrawImage(context, rect, inImage) 

    // Now we can get a pointer to the image data associated with the bitmap 
    // context. 
    let data = CGBitmapContextGetData(context) 
    let dataType = UnsafePointer<UInt8>(data) 

    let offset = 4*((Int(pixelsWide) * Int(point.y)) + Int(point.x)) 
    let alpha = dataType[offset] 
    let red = dataType[offset+1] 
    let green = dataType[offset+2] 
    let blue = dataType[offset+3] 
    let color = NSColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: CGFloat(alpha)/255.0) 

    // Free image data memory for the context 
    free(data) 
    return color; 
} 
+2

Questo metodo ha funzionato come un fascino. Per i futuri visitatori: ho adattato questo metodo a swift 1.2 su https://gist.github.com/jokester/948616a1b881451796d6. – Jokester

+0

Sei riuscito a capire come salvare quell'immagine senza alcuna compressione? –

Problemi correlati