- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试编写一个读取 FITS 图像的应用程序。 FITS 代表 Flexible Image Transport 格式,这种格式主要用于存储与天体物理学相关的科学数据,其次,它被大多数使用 CCD 相机拍摄天空的爱好者天文学家使用。所以 FITS 文件包含图像,但它们也可能包含表格和其他类型的数据。由于我是 Objectiv-C 和 cocoa 编程的新手(我一年前开始这个项目,但由于我很忙,我几乎一年没碰它!),我开始尝试创建一个库,它允许我转换文件的图像内容到 NSImageRep。 FITS 图像二进制数据可以是 8 位/像素、16 位/像素、32 位/像素无符号整数或 32 位/像素、64 位/像素 float ,均采用大端格式。
我设法用 16 位/像素、32 位/像素无符号整数表示灰度 FITS 图像,但是当我寻找 32 位/像素浮点时,我得到了非常奇怪的行为(这个问题值得RGB 32 位/像素 float )。到目前为止,我还没有测试基于 16 位/像素和 32 位/像素整数数据的 8 位/像素整数数据和 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/bits/pix float 据的结果快照:NASA HST picture !
图像似乎向左移动,但更烦人的是我在同一帧中得到同一图像的两个表示(帧的上部和下部)。
对于其他一些文件,行为更奇怪: Star Field 1 ,(对于其他链接se评论,作为新用户,我不能在本文中有两个以上的链接。以及我不能直接放图片。)
所有三个星空图像都是相同拟合文件内容的表示。我在帧的底部获得了图像的正确表示(星星太饱和了,但我还没有玩过编码)。但是,在上半部分,每次我打开同一个文件时,我都会得到不同的图像表示。看起来每次我打开这个文件时,它都不会添加相同的字节序列来生成图像表示(至少对于上半部分)。
另外,我不知道复制在底部的图像是否包含一半数据上半部分是另一半,或者如果它只是数据的副本。
当我以原始格式(人类可读的数字)转换我的数据内容时,数字与像素中应有的内容兼容,位于正确的位置。这让我认为问题不是来自数据,而是来自 CGImage 解释数据的方式,即我在传递给 CGImageCreate 函数的参数中的某处是错误的。
在 RGB 适合图像数据的情况下,我在最后将 18 个图像放入我的帧中。 R、G 和 B 图像各 6 份。全部为灰度。请注意,对于 RGB 图像,我的代码是不同的。
我做错了什么?
最佳答案
好的,我终于找到了我的问题的解决方案,关于图像的复制。这是一个非常愚蠢的错误,我为自己没有早点发现它而感到自豪。
在代码中,我忘记了 case -32
中的 break
。关于画面的转变仍然存在问题。打开 32 位整数图像时我没有看到偏移,但它出现在 32 位 float 据上。
有没有人知道我的代码中这种转变可能来自何处?是因为我构建图像的方式吗?或者这可能是我绘制图像的方式造成的?
下面是我用来绘制图像的一段代码。由于图像首先是颠倒的,所以我稍微改变了坐标。
- (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;
}
关于objective-c - 32 位大端 float 据到 CGImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8393918/
我正在尝试将 cgImage 从旧函数转换为新函数,但我不确定最后一个参数的参数应该是什么。基于旧函数的 param alphaType: 参数为 .alphaIsOne,新参数 param isOp
我尝试通过填写自己的数据来创建 UIImage。到目前为止一切正常。但是,如果我尝试多次调用此函数,它似乎会填满内存,直到应用程序崩溃。使用 VM Tracker,我发现当应用程序崩溃时,脏内存会增长
这是 Apple 的代码(来自技术问答 QA1702),用于从视频缓冲区获取 UIImage。不幸的是,返回的图像旋转了 90 度。如何编辑它以使返回的图像方向正确? - (UIImage *) im
使用标准图像格式(jpeg、gif、png 等)从文件加载 CGImage 或 NSImage 非常简单。 但是,我现在需要从使用 libfreetype 生成的内存中的字节数组创建 CGImage。
我正在使用 CIBloom 模糊 CGImage 中的一些文本,但发生的情况是 CIBloom 过滤器似乎使我的图像变得非常小 . 当滤波器内核变大时效果更差。我有点预料到这一点,但我需要一种方法来关
我有一个内存泄漏,我只是不知道如何解决。 这是泄露的代码: [newImg release]; CGColorSpaceRef d_colorSpace = CGColorSpaceCreateDev
在 iOS 4.0 及更高版本中,有没有一种方法可以在不将整个图像加载到内存的情况下对 CGImage 进行分割?我试图做的是*以编程方式*分割图像,以便在使用大图像的 CATiledLayer 应用
在我的应用中,我想生成一个视频的多个缩略图,最好是质量好的缩略图。我的旧方法是执行一个循环 15 次,并在不同的时间复制一个 CGImage。如下图 func generateThumbnails(_
一种方法是: CGImageRef scaledImage(CGImageref, destination rect) { context = CGBitmapContextCreate(re
我有一个 UIView 子类,它呈现应用了 mask 的图像。它在所有设备(仅限 iPad)上都能完美运行,除了那些具有宽色域显示屏(最新的 iPad Pro)的设备,在这些设备上, mask 呈现完
我正在为 mac 开发一个类似放大镜的应用程序。我的目标是能够在放大时精确定位单个像素。我在 mouseMoved(with event: NSEvent) 中使用此代码: let captureSi
我希望将一个 CGImage 覆盖在另一个之上。 作为示例,第一个 CGImage 为 1024x768,并且想要在给定位置覆盖第二个 100x100 CGImage。 我已经了解了如何使用 NSIm
所以我一直在开发一个小的“绘图”应用程序,用户可以在网格 Canvas 上绘制图像(基本上创建像素艺术)。我想创建一个导出此 Canvas 的函数(将其视为 UIColor 数组,然后将其转换为 Ra
有没有一种方法可以在 iOS 中将原始图像数据存储和加载到磁盘上,以节省解压时间和内存并减少应用程序的脏内存占用? 保罗·哈达德已hinting to something like this我知道这项
我有一个手绘 View (用户可以用手指画线)。我只使用几种颜色,所以我有一个我写的压缩算法(想通过本地网络将它发送到另一台 iPad)但我似乎无法准确地从图形上下文中获取数据,即使使用这个简单的测试
我正在尝试编写一段代码来判断 CGPoint 是否位于图像的黑色区域内(成功的答案是 here )。在我的实现中,如果使用此代码触摸点为黑色,我可以成功返回 NSLog: -(void)touches
我正在通过网络连接接收一系列图像,并希望尽快显示它们,最高可达 30 FPS。我派生了一个 UIView 对象(因此我可以覆盖 drawRect)并公开了一个名为 cameraImage 的 UIIm
我有以下代码: UIImage *img = [UIImage imageNamed:@"BRBlueCircleMask"]; CGImageRef activeCirleMaskImage = i
对于物理缩放任何 UIImage 的方法,我需要创建位图上下文,它具有与图像完全相同的设置,除了目标宽度和高度。 到目前为止,这是我的代码。缺少什么:如何为 CGBitmapContextCreate
我有一个图像,其 RGB 分量是全白的,具有不同的 alpha -- 例如,RGBA 格式的 0xFFFFFF09。但是,当我使用 UIImage 或 CGImage API 加载此图像,然后在 CG
我是一名优秀的程序员,十分优秀!