문제

다음 코드와 함께 CGBITMAPCONTEXT에서 ARGB 구성 요소를 얻으려고합니다.


-(id) initWithImage: (UIImage*) image   //create BitmapContext with UIImage and use 'pixelData' as the pointer
{

        CGContextRef    context = NULL;
        CGColorSpaceRef colorSpace;
        int             bitmapByteCount;
        int             bitmapBytesPerRow;

        bitmapBytesPerRow   = (image.size.width * 4);                       
        bitmapByteCount     = (bitmapBytesPerRow * image.size.height);

        colorSpace = CGColorSpaceCreateDeviceRGB();                         
        pixelData = malloc( bitmapByteCount );      //unsigned char* pixelData is defined in head file
        context = CGBitmapContextCreate (pixelData,                         
                        image.size.width,
                        image.size.height,
                        8,    // bits per component
                        bitmapBytesPerRow,
                        colorSpace,
                        kCGImageAlphaPremultipliedFirst
                        );
        CGColorSpaceRelease( colorSpace );                                  

        CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
        pixelData = CGBitmapContextGetData(context);
        return self;
}


-(float) alphaAtX:(int)x y:(int)y   //get alpha component using the pointer 'pixelData' 
{
    return pixelData[(y *width + x) *4 + 3];    //+0 for red, +1 for green, +2 for blue, +3 for alpha
}

-(void) viewDidload {[Super ViewDidload]; uiimage *img = [uiimage imageNamed :@"macdrive.png"]; // 이미지로드

[self initWithImage:img];   //create BitmapContext with UIImage
float alpha = [self alphaAtX:20 y:20];  //store alpha component

}

빨간색/녹색/파란색을 저장하려고 할 때는 항상 240 명으로 판명됩니다. 그리고 알파는 항상 255입니다.

그래서 포인터에 뭔가 잘못되었다고 생각합니다. 내가 원하는 올바른 ArgB 데이터를 반환 할 수 없습니다. 코드에 무엇이 잘못되었는지에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

우선, 당신은 메모리를 새기고 있습니다. 픽셀 다타 메모리는 결코 해방되지 않습니다.

사용을 위해 CGContext 호출이 메모리를 관리하는 것이 좋습니다. 단순히 null iso pixeldata를 통과시키고, 당신이 당신의 컨텍스트에 참조 수를 유지하는 한 CGBitmapContextGetData(context) 유효합니다.

알파를 사용하는 마지막 항목 (ARGB가 아닌 RGBA) 인 것처럼 Alpha를 사용하거나 컨텍스트를 작성하는 데 사용하거나 alphaAtX 암호. 알파 값을 확인하는 것이라면, 당신이 전형적인 것을 원한다면, 당신은 그렇지 않습니다.

모두 :

[...]
CGContextRelease(context);
context = CGBitmapContextCreate (NULL,                                                     
                                    image.size.width,
                                    image.size.height,
                                    8,    // bits per component
                                    bitmapBytesPerRow,
                                    colorSpace,
                                    kCGImageAlphaLast
                                    );
CGColorSpaceRelease( colorSpace );                                                                      

CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
pixelData = CGBitmapContextGetData(context);
[...]

컨텍스트가 멤버 변수 인 경우 NULL로 초기화 된 것은 이미 올바른 방향으로 단계적입니다.

다른 팁

먼저, 나는 당신의 컨텍스트가 반환되었는지 확인할 것입니다. CGBitmapContextCreate 통화는 유효합니다 (즉, 확인하십시오 context != NULL). 또한 원래로드 된 이미지가 유효한지 확인하십시오 (따라서 확인하십시오. img != nil).

컨텍스트가 nil 인 경우 이미지 크기가 비합리적이거나 픽셀 데이터 형식을 사용할 수 없기 때문일 수 있습니다. 사용해보십시오 kCGImageAlphaPremultipliedLast 대신에?

둘째, 사용할 필요가 없습니다 CGBitmapContextGetData - 당신은 그냥 사용할 수 있습니다 pixelData 당신이 처음으로 지나간 포인터. 당신도해야합니다 CGContextRelease 당신의 문맥을 떠나기 전에 initWithImage: 누출을 피하기 위해 기능.

또한 당신이 사용하고 있음에 주목합니다 kCGImageAlphaPremultipliedFirst. 이것은 알파 구성 요소가 있음을 의미합니다 첫 번째, 당신의 이미지에서는 마지막이 아니므로, 당신은 당신의 알파 구성 요소에 대해 0의 오프셋을 원합니다. alphaAtX:y: 기능.

그 도움이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top