2011-12-06 11 views
3

FITSイメージを読み取るアプリケーションを作成しようとしています。 FITSはFlexible Image Transportフォーマットの略で、天体物理学に関する科学的データを保存するために主に使用されるフォーマットの願いであり、第2に、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浮動小数点用)。これまでのところ、Web上のサンプルファイルが見つからないため、16ビット/ pixと32ビット/ pix整数データに基づいて8ビット/ pix整数データとRGBイメージをテストしていません。 NASA HST picture

-(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; 
} 

、ここ32 /ビット/ PIX浮動小数点データに対する結果のスナップショットです:次のように

は、グレースケール画像形式は、ファイルをフィット作成するために、私のコードです!

イメージは左にシフトしているようですが、同じフレーム内で同じイメージ(フレームの上部と下部の2つの表現)が2つ表示されるということは厄介です。

Star Field 1(他のリンクについては、新しいユーザーとして、このテキストには2つ以上のリンクを含めることはできません。

すべての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; 
} 
関連する問題