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 이미지의 경우 코드가 다릅니다.
내가 뭘 잘못하고 있니?
다른 두 이미지의 올바른 링크 : [스타 필드 2] (https://files.me.com/gillard.w/e49ip6)와 [스타 필드 3] (https : //로 파일. me.com/gillard.w/dznhqc) –