我已经成功地实现了16位/像素、32位/像素无符号整数的灰度FITS图像的图像表示,但当我尝试寻找32位/像素浮点数时(RGB 32位/像素浮点数同样存在问题),我得到了非常奇怪的行为。到目前为止,我还没有针对8位/像素整数数据和基于16位/像素和32位/像素整数数据的RGB图像进行测试,因为我还没有在网上找到示例文件。
下面是我创建灰度图像的代码:
-(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位/像素浮点数据的结果快照:NASA HST图片!
图像似乎向左移动,但更令人恼火的是,我在同一帧中得到了同一图像的两个表示(帧的上部和下部)。
对于其他文件,行为更加奇怪: Star Field 1。(关于其他链接,请查看评论,作为新用户,我不能在此文本中使用超过两个链接。我也无法直接放置图像。)
所有三个星场图像都是相同fits文件内容的表示。我在框架的底部获得了正确的图像表示(星星太饱和了,但我还没有尝试编码)。但是,在上半部分,每次打开相同的文件时,我都会得到图像的不同表示。看起来每次打开此文件时,它都不会采用相同的字节序列来生成图像表示(至少对于上部分是这样)。
此外,我不知道底部重复的图像是否包含了一半的数据,而上面则是另外一半,或者它只是数据的副本。
当我将数据内容转换为基本格式(人类可读数字)时,数字与像素应该在正确的位置兼容。这让我认为问题不是来自数据而是来自CGImage解释数据的方式,即我在向CGImageCreate函数传递参数时出错了。
对于RGB fits图像数据,最终在我的帧中获得了18个图像。每个R、G和B图像都有6个副本。所有图像都是灰度的。请注意,在RGB图像的情况下,我的代码不同。
我做错了什么?