2011-12-20 6 views
0

저는 카이로에서 Quartz로 이미지 드로잉 코드를 변환 중입니다. 천천히 진보하고 Quartz를 배워 가고 있지만 이미지 포맷에 문제가 있습니다. 이 같이 작동 카이로 버전에서 CGBitmapContextCreate 및 인터레이스 된? image

다음 Cairo::ImageSurface에서 예상대로

unsigned short *d = (unsigned short*)imageSurface->get_data(); 
int stride = imageSurface->get_stride() >> 1; 

int height = imageHeight; 
int width = imageWidth; 
do { 

    d = *p++; // p = raw image data 
    width --; 

    if(width == 0) { 
     height --; 
     width = imageWidth; 
     d += stride; 
    } 

} while(height); 

지금이 이미지를 생성합니다. 나는 석영을 사용하는 방법에 이상이 변환 한 그것은 진전을 보이고 있지만 잘못된거야 어디 확실하지 않다 :

NSInteger pixelLen = (width * height) * 8; 
unsigned char *d = (unsigned char*)malloc(pixelLen); 
unsigned char *rawPixels = d; 

int height = imageHeight; 
int width = imageWidth; 
do { 

    d = *p++; // p = raw image data 
    width --; 

    if(width == 0) { 
     height --; 
     width = imageWidth; 
    } 

} while(height); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(rawPixels, imageWidth, imageHeight, 8, tileSize * sizeof(int), colorSpace, kCGBitmapByteOrderDefault); 
CGImageRef image = CGBitmapContextCreateImage(context); 
CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 
UIImage *resultUIImage = [UIImage imageWithCGImage:image]; 
CGImageRelease(image); 

을 지금이 분명히 올바른 방향으로 향하고 보이는 무언가를 만들어으로 원하는 이미지와는 조금 비슷하지만 이미지의 복사본 4 개를 연속으로 생성합니다. 각 픽셀은 서로 다른 픽셀로 채워져 있으므로이 이미지가 인터레이스 된 것으로 가정합니다. 이미지 형식에 대해서는 잘 모릅니다. 어떻게 든 어떻게 그들을 결합하여 완전한 이미지를 만들 필요가 있지만 Quartz로 어떻게 할 지 모르겠습니다.

나는 stride이 문제와 관련이 있다고 생각하지만, 이것은 한 픽셀 행에서 Quartz의 컨텍스트와 관련이없는 다른 행까지의 바이트 거리라는 것을 이해하고 있는가?

답변

0

stride는 rowBytes 또는 bytesPerRow에 해당합니다. 이 값은 행이 최적화 된 오프셋으로 패딩 될 수 있기 때문에 width * bytesPerPixel과 반드시 ​​같을 필요가 없으므로 중요합니다.

카이로 코드가 무엇을하고 있는지 명확하게 알 수는 없지만 정확한 모양도 아닙니다. 어느 쪽이든, 보폭 부분이 없으면 루프는 의미있는 바가 없습니다. 왜냐하면 바이트의 정확한 복사본을 만들기 때문입니다.

카이로 코드의 루프는 바이트 행을 복사 한 후 다음 데이터 행을 건너 뛰고 있습니다.

+0

안녕하세요. 정보를 제공해 주셔서 감사합니다. 이것은 더 이해하기 시작합니다. 카이로 문서에서 보폭은 "스트라이드는 이미지 데이터의 한 행 시작부터 다음 행의 시작까지의 거리 (바이트)"입니다. 귀하의 올바른 소리처럼 CGBitmapContextGetBytesPerRow()에서 반환 된 값이 될 것입니다. 나는 그에 따라 코드를 업데이트했는데 결과 이미지가 32 비트가 아닌 8 비트 또는 16 비트 이미지라고 생각하게 만드는 오른쪽 이미지가 부숴 졌기 때문에 여전히 올바르지 않습니까? 8 비트 또는 16 비트 비트 맵을 만들려면 어떻게해야합니까? – JWood

+0

카이로 코드는 픽셀 당 2 바이트를 사용하는 것 같습니다 (한 번에 하나의 부호없는 짧은 (16 비트)를 복사하고 있습니다.) 귀하의 코드는 픽셀 당 1 바이트 만 복사합니다 ... –

관련 문제