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