2016-12-21 4 views

답변

3

의 우리가 화면을 캡처 할 수있는 CoreGraphics 및 CoreFoundation에서를 사용하고 이미지 데이터 싶어한다고 가정 해 봅시다 :

package main 

// To use the two libraries we need to define the respective flags, include the required header files and import "C" immediately after 
import (
    // #cgo LDFLAGS: -framework CoreGraphics 
    // #cgo LDFLAGS: -framework CoreFoundation 
    // #include <CoreGraphics/CoreGraphics.h> 
    // #include <CoreFoundation/CoreFoundation.h> 
    "C" 
    "image" 
    "reflect" 
    "unsafe" 
    // other packages... 
) 

func main() { 
    displayID := C.CGMainDisplayID() 
    width := int(C.CGDisplayPixelsWide(displayID)) 
    height := int(C.CGDisplayPixelsHigh(displayID)) 
    rawData := C.CGDataProviderCopyData(C.CGImageGetDataProvider(C.CGDisplayCreateImage(displayID))) 

    length := int(C.CFDataGetLength(rawData)) 
    ptr := unsafe.Pointer(C.CFDataGetBytePtr(rawData)) 

    var slice []byte 
    hdrp := (*reflect.SliceHeader)(unsafe.Pointer(&slice)) 
    hdrp.Data = uintptr(ptr) 
    hdrp.Len = length 
    hdrp.Cap = length 

    imageBytes := make([]byte, length) 

    for i := 0; i < length; i += 4 { 
    imageBytes[i], imageBytes[i+2], imageBytes[i+1], imageBytes[i+3] = slice[i+2], slice[i], slice[i+1], slice[i+3] 
     } 

    C.CFRelease(rawData) 

    img := &image.RGBA{Pix: imageBytes, Stride: 4 * width, Rect: image.Rect(0, 0, width, height)} 

    // There we go, we can now save or process the image further 
    }