2011-12-06 4 views
3

FITS 이미지를 읽는 응용 프로그램을 작성하려고합니다. FITS는 유연한 이미지 전송 형식을 나타내며 천체 물리학과 관련된 과학 데이터를 저장하는 데 주로 사용되는 형식의 소원이며 두 번째로 CCD 카메라로 하늘 사진을 촬영하는 대부분의 천문학 자에 의해 사용됩니다. 따라서 FITS 파일에는 이미지가 포함되어 있지만 테이블과 다른 종류의 데이터도 포함될 수 있습니다. Objectiv-C와 코코아 프로그래밍이 새로운데 (1 년 전에이 프로젝트를 시작했지만, 바쁜 이래로 거의 1 년 동안 만지지는 않았습니다!), 나는 라이브러리를 만들려고 노력했습니다. 파일의 이미지 내용을 NSImageRep에 저장합니다. FITS 이미지 바이너리 데이터는 빅 엔디안에서 모두 8 비트/pix, 16 비트/pix, 32 비트/pix 부호없는 정수 또는 32 비트/pix, 64 비트/pix 부동 소수점 수 있습니다.CGImage에 32 비트 빅 엔디안 부동 소수점 데이터

16 비트/pix, 32 비트/pix 부호없는 정수로 그레이 스케일 FITS 이미지의 이미지 표현을 관리 할 수 ​​있지만 32 비트/pix 부동 소수점을 찾을 때 매우 이상한 동작을합니다 (문제는 RGB 32 비트/pix 부동 소수점의 경우). 지금까지 웹에서 예제 파일을 찾지 못했기 때문에 8 비트/pix 정수 데이터와 16 비트/pix 및 32 비트/pix 정수 데이터를 기반으로 한 RGB 이미지를 테스트하지 않았습니다. 32/비트/PIX는 부동 소수점 데이터 결과의 스냅 샷을

-(void) ConstructImgGreyScale 
{ 
CGBitmapInfo  bitmapInfo; 
int bytesPerRow; 

switch ([self BITPIX]) // BITPIX : Number bits/pixel. Information extracted from the FITS header 
{ 
    case 8: 
     bytesPerRow=sizeof(int8_t); 
     bitmapInfo = kCGImageAlphaNone ; 
     break; 
    case 16: 
     bytesPerRow=sizeof(int16_t); 
     bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrder16Big; 
     break; 
    case 32: 
     bytesPerRow=sizeof(int32_t); 
     bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrder32Big; 
     break; 
    case 64: 
     bytesPerRow=sizeof(int64_t); 
     bitmapInfo = kCGImageAlphaNone; 
     break; 
    case -32: 
     bytesPerRow=sizeof(Float32); 
     bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrder32Big | kCGBitmapFloatComponents; 
    case -64: 
     bytesPerRow=sizeof(Float64); 
     bitmapInfo = kCGImageAlphaNone | kCGBitmapFloatComponents; 
     break; 
    default: 
     NSLog(@"Unknown pixel bit size"); 
     return; 
} 
[self setBitsPerSample:abs([self BITPIX])]; 

[self setColorSpaceName:NSCalibratedWhiteColorSpace]; 

[self setPixelsWide:[self NAXESofAxis:0]]; // <- Size of the X axis. Extracted from FITS header 
[self setPixelsHigh:[self NAXESofAxis:1]]; // <- Size of the Y axis. Extracted from FITS header 

[self setSize: NSMakeSize(2*[self pixelsWide], 2*[self pixelsHigh])]; 

[self setAlpha: NO]; 
[self setOpaque:NO]; 

CGDataProviderRef provider=CGDataProviderCreateWithCFData ((CFDataRef) Img); 

CGFloat Scale[2]={0,28}; 
image = CGImageCreate ([self pixelsWide], 
         [self pixelsHigh], 
         [self bitsPerSample], 
         [self bitsPerSample], 
         [self pixelsWide]*bytesPerRow, 
         [[NSColorSpace deviceGrayColorSpace] CGColorSpace], 
         bitmapInfo, 
         provider, 
         NULL, 
         NO, 
         kCGRenderingIntentDefault 
         ); 

CGDataProviderRelease(provider); 
return; 
} 

을하고 여기에 있습니다 : : 다음과 같이

는 그레이 스케일 이미지 양식을 작성하려면 코드 것은 파일에 맞는 NASA HST picture!

이미지가 왼쪽으로 시프트되는 것처럼 보이지만 더 짜증나게하는 것은 동일한 프레임에서 동일한 이미지 (프레임의 위쪽과 아래쪽 부분)를 2 번 표시한다는 것입니다.

Star Field 1 다른 파일의 경우 다른 사용자의 의견으로는이 텍스트에 두 개 이상의 링크를 포함 할 수 없습니다. 이미지를 직접 입력하십시오.)

모든 3 개의 별표 이미지는 동일한 파일 내용을 표현한 것입니다. 프레임의 아래 부분에서 이미지의 올바른 표현을 얻습니다 (별이 너무 많이 포화되었지만 아직 인코딩을 사용하지 않았습니다). 그러나 위 부분에서 동일한 파일을 열 때마다 이미지의 다른 표현이 나타납니다. 이 파일을 열 때마다처럼 보이지만, 이미지 표현을 생성하기 위해 동일한 순서의 바이트를 압정하지 않습니다 (적어도 상단 부분에 대해서는).

또한 하단에 복제 된 이미지에 데이터 의 반쪽과 상단의 나머지 절반이 포함되어 있는지 또는 단순히 데이터 사본인지 여부는 알 수 없습니다.

내 데이터의 내용을 원시 형식 (사람이 읽을 수있는 숫자)으로 변환하면 숫자는 좋은 위치에있는 픽셀의 내용과 호환됩니다. 이 문제는 데이터에서 오는 것이 아니라 CGImage가 데이터를 해석하는 방식, 즉 CGImageCreate 함수에 전달하는 인수의 어딘가에서 잘못되었다고 생각합니다.

이미지 데이터에 맞는 RGB의 경우, 프레임의 18 번째 이미지를 얻습니다. R, G 및 B 이미지 각각 6 매. 모두 회색조입니다. RGB 이미지의 경우 코드가 다릅니다.

내가 뭘 잘못하고 있니?

+0

다른 두 이미지의 올바른 링크 : [스타 필드 2] (https://files.me.com/gillard.w/e49ip6)와 [스타 필드 3] (https : //로 파일. me.com/gillard.w/dznhqc) –

답변

1

좋아, 마침내 이미지의 복제와 관련하여 제 문제에 대한 해결책을 찾았습니다. 그리고 이것은 매우 어리석은 실수 였고, 이전에 그것을 찾지 못해서 자랑스럽지 않습니다.

코드에서 나는 case -32break을 잊어 버렸습니다. 여전히 문제는 그림의 이동에 관한 것입니다. 32 비트 정수 이미지를 열 때 전환이 보이지 않지만 32 비트 부동 소수점 데이터에 나타납니다.

누구나 내 코드에서 이러한 변화가 발생할 수있는 아이디어가 있습니까? 이미지를 구성하는 방식 때문입니까? 아니면 내가 이미지를 그리는 방식에 뒤따른 것이 가능합니까?

벨로우는 이미지를 그릴 때 사용하는 코드 조각입니다. 이미지가 처음부터 거꾸로 된 이후 좌표를 약간 변경했습니다.

- (bool)draw { 
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; 
if (!context || !image) { 
    return NO; 
} 
NSSize size = [self size]; 

CGContextTranslateCTM(context, 0, size.height); 
CGContextScaleCTM(context, 1, -1); 

CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), image); 
return YES; 
} 
관련 문제