来自一维像素阵列的 NSImage?

2024-03-29

我的程序中有一个大型一维动态数组,它表示磁盘上的 FITS 图像,即它保存图像的所有像素值。数组的类型是double。目前,我只关心单色图像。

由于 Cocoa 不直接支持 FITS 格式,因此我使用 CFITSIO 库读取图像。这是可行的 - 我可以根据需要操作数组并使用库将结果保存到磁盘。

但是,我现在想显示图像。我认为这是 NSImage 或 NSView 可以做的事情。但类引用似乎没有列出可以采用 C 数组并最终返回 NSImage 对象的方法。我发现的最接近的是-initWithData:(NSData*)。但我不能 100% 确定这是否是我所需要的。

我是不是找错树了?任何指向可以处理这个问题的类或方法的指针都是

EDIT:

这是更新后的代码。请注意,我将每个像素设置为 0xFFFF。这只会产生灰色图像。这当然只是一个测试。加载实际的 FITS 文件时,我将 0xFFFF 替换为imageArray[i * width + j]。这在 8 位中完美运行(当然,我将每个像素值除以 256 以用 8 位表示)。

 NSBitmapImageRep *greyRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
                                                                     pixelsWide:width
                                                                     pixelsHigh:height
                                                                  bitsPerSample:16
                                                                samplesPerPixel:1
                                                                       hasAlpha:NO
                                                                       isPlanar:NO
                                              colorSpaceName:NSCalibratedWhiteColorSpace
                                                                    bytesPerRow:0
                                                                   bitsPerPixel:16];

 NSInteger rowBytes = [greyRep bytesPerRow];
 unsigned short*pix = (unsigned short*)[greyRep bitmapData];
 NSLog(@"Row Bytes: %d",rowBytes);

if(temp.bitPix == 16) // 16 bit image
{
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            pix[i * rowBytes + j] = 0xFFFF;
        }
    }
}

我也尝试过直接使用Quartz2D。即使是 16 位,这也确实会产生正确的图像。但奇怪的是,数据数组将 0xFF 作为白色,而不是 0xFFFF。所以我仍然必须将所有内容除以 0xFF - 在此过程中丢失数据。 Quartz2D代码:

    short* grey = (short*)malloc(width*height*sizeof(short));
    for(int i=0;i<width*height; i++)
    {
        grey[i] = imageArray[i];
    }

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef bitmapContext = CGBitmapContextCreate(grey, width, height, 16, width*2, colorSpace, kCGImageAlphaNone);
    CFRelease(colorSpace);

    CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);

    NSImage *greyImage = [[NSImage alloc] initWithCGImage:cgImage size:NSMakeSize(width, height)];

有什么建议么?


initWithData仅适用于系统已知的图像类型。对于未知类型和原始像素数据,您需要自己构建图像表示。您可以按照 Kirby 链接到的答案中的建议通过 Core Graphics 执行此操作。或者,您可以使用NSImage通过创建并添加NSBitmapImageRep.

确切的细节将取决于像素数据的格式,但这里是灰度图像的过程示例,其中源数据(samplesarray) 表示为 [0,1] 范围内的 double:

/* generate a greyscale image representation */
NSBitmapImageRep *greyRep =
    [[NSBitmapImageRep alloc]
        initWithBitmapDataPlanes: nil  // allocate the pixel buffer for us
                      pixelsWide: xDim 
                      pixelsHigh: yDim
                   bitsPerSample: 8
                 samplesPerPixel: 1  
                        hasAlpha: NO
                        isPlanar: NO 
                  colorSpaceName: NSCalibratedWhiteColorSpace // 0 = black, 1 = white in this color space
                     bytesPerRow: 0     // passing 0 means "you figure it out"
                    bitsPerPixel: 8];   // this must agree with bitsPerSample and samplesPerPixel

NSInteger rowBytes = [greyRep bytesPerRow];

unsigned char* pix = [greyRep bitmapData];
for ( i = 0; i < yDim; ++i )
{
    for ( j = 0; j < xDim; ++j )
    {
        pix[i * rowBytes + j] = (unsigned char)(255 * (samples[i * xDim + j]));
    }
}

NSImage* greyscale = [[NSImage alloc] initWithSize:NSMakeSize(xDim,yDim)];
[greyscale addRepresentation:greyRep];
[greyRep release];

EDIT(回应评论)

我不确定是否支持 16 位样本,但您似乎已经确认它们是支持的。

您所看到的源于仍然将像素视为unsigned char,即 8 位。因此,您只需设置每行的一半,并且一次将每个像素设置为两个字节值0xFF00——不是很纯正的白色,但非常接近。图像的另一半没有被触及,但会被初始化为 0,因此它保持黑色。

You need instead to work in 16 bit, by first casting the value you get back from the rep:

unsigned short * pix = (unsigned short*) [greyRep bitmapData];

然后为像素分配 16 位值:

if ( j % 2 )
{
    pix[i * rowBytes + j] = 0xFFFF;
}
else
{
    pix[i * rowBytes + j] = 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自一维像素阵列的 NSImage? 的相关文章

  • 相当于 Cocoa 中的 FileSystemWatcher (.NET)

    我正在 Cocoa 中开发一个应用程序 我想不断检查特定位置的文件内容是否已更改 例如FileSystemWatcher在 NET中 请任何人给我一个解决方案 请看一下FSEvents http developer apple com do
  • 如何在将图像上传到 Firebase 之前调整图像大小?

    我之前看到过这个问题 但没有一个解决方案真正适合我的情况 除了节省一些空间之外 我还想节省从 Firebase 存储上传 下载内容的时间 由于 firebase 使用图像 uri 我想不出实现此目的的正确方法 解决方案可能是创建一个 副本
  • TextKit:Xcode 中的编辑器占位符功能是如何实现的?

    我深入研究了 TextKit 想知道编辑器占位符是如何在 Xcode 代码编辑器中实现的 您也可以自己尝试一下并输入以下内容 lt Hello gt 它会自动变成占位符 Xcode 编辑器是使用 TextKit 构建的 经过一番研究 我想出
  • 通过css替换图片

    我正在 Stylish 一个 Firefox 插件 中编写代码来更改显示的图像 image 属性没有 div 标签 所以我必须使用它 img src s dschjungelplanet 因此 这将替换页面中任何位置的 img src 中的
  • Android:如何以原始尺寸显示图像

    我从字节数组创建位图图像并将其显示在 ImageView 中 这android layout width and android layout heightImageView 的设置为wrap content 并且android scale
  • CFP 对 /Library/Preferences 的引用

    我在系统偏好设置中使用了 prefpane 带有授权锁 我需要了解我的偏好并写信给 Library Preferences 但是 每当我尝试将首选项同步到kCFPreferencesAnyUser and kCFPreferencesCur
  • NSCollectionView:仅接受项目之间的拖动,而不接受拖动

    我有一个NSCollectionView已实施且工作良好 然而 当 拖动项目来重新排列它们 我只想接受拖动 物体之间 当前的行为是您可以在对象之间拖动 它会打开一个 空间 而且over一个东西 我希望下面的图片能更好地说明问题 例如 将项目
  • Python向图像添加额外区域

    所以我有一张包含图像尺寸的表格 有多个不同尺寸的图像 66x66 400x400 等 我有一个图像示例 原始图像 其尺寸始终为 600x532 该图像上是一种产品 电视 PC 等 我必须调整该图像的大小 这不是问题 但如果我按照比例这样做
  • 如何更改目录缩略图、产品缩略图中的元(alt 和标题)? - Woocommerce

    默认情况下Woocommerce对于 alt 使用图像文件的名称 有谁知道如何更改缩略图元 alt 和标题 以显示产品名称 尝试这个 add filter wp get attachment image attributes change
  • Cocoa 脚本:返回“null”与“缺失值”

    看来 AppleScript 知道这个特殊值null 如何从基于 Cocoa 脚本的应用程序中为可编写脚本的属性返回这样的值 如果我回来nil NULL or NSNull对于来自我的基于 Cocoa 脚本的应用程序的可编写脚本的属性 ge
  • 在全日历中显示图像作为背景

    我一直在寻找一些代码来使用图像作为 fullcalendar 中事件的背景 全日历 jQuery https fullcalendar io 但我所能找到的只是向所述事件添加图标的代码 我想做这样的事情 更新 2016 09 23 晚上 8
  • 如何在显示模态表时禁用 Cocoa 的默认动画?

    我想禁用 Cocoa 在显示模式表时执行的动画 Apple s 表编程指南 http developer apple com mac library documentation Cocoa Conceptual Sheets Concept
  • Rails 3 - 带 image_tag + 文本的 link_to

    这部分代码将生成我图片 png作为链接 我需要在该图像上附加一些文本 图像 文本 我尝试了类似的操作
  • 如何在 Cocoa 中检查文件是否被锁定?

    有没有API可以检查文件是否被锁定 我在中找不到任何 APINSFileManagerclass 让我知道是否有任何API可以检查文件的锁定 我发现以下与文件锁定相关的链接 http lists apple com archives coc
  • OS X 应用程序图标和菜单栏图标的图标大小

    OS X 的应用程序图标和菜单栏图标应该有多大 我可以处理小分辨率显示屏 但 Retina 显示屏怎么样 在配备 Retina 显示屏的新 MacBook Pro 上 菜单栏上显示的图标 例如 20 x 20 是否会更小或模糊 我认为应用程
  • 非矩形 CSS 图像链接

    我有以下要求 大图像包含多个需要链接到其他页面的 热点 听起来很简单 我创建了一个简单的 html 页面 一个带有背景图像的 div 和使用带有图像精灵翻转的 CSS 的绝对定位链接 然而 现在我看到了另一张图像 热点不是方形的 而是不规则
  • UIImage 来自 NSString 中保存的字节

    我正在尝试从实际上保存在 NSString 中的字节数组创建 UIImage 有人可以告诉我该怎么做吗 这是我想做的事情 NSString sourceString mYActualBytesAREinHERe get the bytes
  • CSS 可调整大小的带标题的图像

    我正在尝试获取并排显示的两个图像的 HTML 布局 并填充页面 同时保持其纵横比并保持图像彼此相邻 即不在页面每一半的中心 我还想要顶部有一个标题 我几乎已经使用下面的 CSS hackery 实现了这一目标 目前它看起来像这样 如果我水平
  • 在 Kohana 3.2 视图中输出图像

    我有以下脚本将图像输出到浏览器 效果很好 file to output SERVER DOCUMENT ROOT static imgs uploads 20110318172207 16 jpg header Content Type i
  • 我可以编辑 UIImage 属性 CGImage 的像素吗

    UIImage有一个只读属性CGImage 我必须将其像素读取到内存块并对其进行编辑 然后制作一个新的 UIImage 来替换旧的 我想知道是否有办法绕过只读属性并直接编辑这些像素 Thanks 谢谢大家 我找到了一种方法来做到这一点 使用

随机推荐

  • QT 程序包含带有 if-test-then 块的 bash 脚本以及内部问题错误中转义的必要引号

    我正在尝试在 QT 应用程序中运行一个小型 bash 脚本 其中包含 if test then 块以及测试中必要的引号 由于脚本应该由 QT 编译并由 bash 运行 因此引号必须转义两次 因此引号的转义反斜杠也必须转义 正如我所见 不幸的
  • Javascript + HTML - 在后台加载图像(异步?)

    我发现了许多描述 javascript 图像加载的主题 但并不完全是我正在寻找的内容 我目前正在以正常方式加载 html 中的图像 例如 img src images big image jpg 这会导致网页上有空白区域 从上到下填充有加载
  • iOS 6 - 如何获得“释放刷新”动画?就像在邮件中一样?

    在邮件应用程序中 我们现在可以drag the view down and release to refresh 如下图所示 这是我可以从 SDK 获得的标准东西吗 Thanks 使用新的iOS6UIRefreshControl https
  • 如何在 Slim 模板中渲染 HTML

    我正在尝试渲染一个前面带有图标的链接 我在用着Slim https github com stonean slim模板引擎以及引导CSS http twitter github com bootstrap base css html ico
  • 如何模拟数据库故障以进行测试(在 Ruby on Rails 中)

    通过某些监视工具 例如 Monit 通过心跳消息来监视应用程序是一种常见的设置 如果应用程序正在运行并且一切正常 它会返回 我还活着 消息 如果数据库失败或 Web 服务器挂起 它不会返回任何内容或返回内部服务器错误 HTTP 状态代码 5
  • Jupyter 笔记本中的函数单元测试?

    我有一个 Jupyter 笔记本 我打算反复运行 里面有函数 代码结构是这样的 def construct url data return url def scrape url url fetch url extract data retu
  • 在 Cython 中共享扩展类型以实现静态类型

    我将 Python 类转换为 pyx 文件内的扩展类型 我可以在另一个 Cython 模块中创建这个对象 但是我无法进行静态类型处理用它 这是我的课程的一部分 cdef class PatternTree cdef public Patte
  • 用于过滤 Django 列表的下拉选择选项

    来自 Angular 这很容易做到 但我不确定从哪里开始创建一个将从对象列表中过滤的下拉表单 基本上 我有下面的代码 它将拉入并显示所有房地产列表 我想创建一个下拉菜单 其中有两个选择 精选 和 新列表 当用户选择其中一个时 列表将过滤掉并
  • F# 模块间相互递归

    对于 F 中的递归 现有文档清楚地说明了在只有一个函数调用自身或一组物理上相邻的函数相互调用的特殊情况下如何执行递归 但一般情况下 不同模块中的一组函数需要相互调用 该怎么做呢 我认为在 F 中没有办法实现这一点 通常可以以不需要这样做的方
  • 函数定义的类外声明中不可能完全限定类名

    该程序会导致不必要的解析贪婪死胡同 struct float4x4 class C float4x4 M float4x4 C M return float4x4 8 1 错误 float4x4 中没有名为 C 的成员 您的意思只是 C 吗
  • 扩展 CodeIgniter 控制器时出错[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 如何格式化运算符 C++ Visual Studio 之间的空格?

    我想要实现的是寻找是否存在一种方法来格式化 C Visual Studio 在我的例子中为 2012 中运算符之间的空格 例如 用 C 编写以下代码行 int number 10 Then hitting Ctrl K Ctrl D in
  • Web.Debug.config 和 Web.Release.Config 文件的用途是什么?

    我刚刚升级到 Visual Studio 2010 和 MVC 2 0 我注意到 Web config 附加了两个附加文件 这些文件是否用于指定调试和发布特定设置 以便您不会弄乱主 Web config 如果我在调试和发布 Web conf
  • JSP gzip 输出流

    我知道我可以使用类似的东西来压缩输出流 OutputStream outA response getOutputStream outWriter new PrintWriter new GZIPOutputStream outA false
  • 如何使用Spring Data Jpa实现批量更新?

    如何使用Spring Data Jpa实现批量更新 我有一个商品实体 对于不同的用户级别 有不同的价格 例如 goodsId level price 1 1 10 1 2 9 1 3 8 当更新商品时我想批量更新这些价格 如下所示 Quer
  • 基于 webkit 的浏览器的 CSS 规则

    我有下一个 CSS 代码 mgheader letters display inline block margin left 55px margin top 45px position absolute mgheader letters d
  • 运行 Web 角色(Web 应用程序)的 Azure 云服务内存问题(Gen2)

    我有一个关于运行 MVC 应用程序的 Web 角色的高内存使用率的问题 使用简单注入器作为 DI 实体框架 6 用于 DAL 应用程序作为 Web 角色在 Azure 云服务上运行 具有 2 个标准 A2 实例 2 个核心 3 5 GB R
  • 将 WMI 调用转换为 CIM 调用

    我正在编写的代码应该启动当前可用于使用 CIM 的服务器的任何补丁 由于我的网络需要 DCOM 协议 我必须使用 CIM 我使用 以便于查看 以下 wmi 代码有效 ComputerName Foo System Management Ma
  • 如何使用Windows设备避免DLL劫持

    我开发了一个 Win32 应用程序 它调用使用 Windows 单元的 Win API 我相信这会调用Windows的系统库 例如kernel32 dll versions dll等 但安全审查员表示存在与预加载DLL劫持相关的安全问题 我
  • 来自一维像素阵列的 NSImage?

    我的程序中有一个大型一维动态数组 它表示磁盘上的 FITS 图像 即它保存图像的所有像素值 数组的类型是double 目前 我只关心单色图像 由于 Cocoa 不直接支持 FITS 格式 因此我使用 CFITSIO 库读取图像 这是可行的