Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa n从1D像素阵列成像?_Cocoa_Image_Nsview_Nsdata_Nsimage - Fatal编程技术网

Cocoa n从1D像素阵列成像?

Cocoa n从1D像素阵列成像?,cocoa,image,nsview,nsdata,nsimage,Cocoa,Image,Nsview,Nsdata,Nsimage,我的程序中有一个大的1D动态数组,表示磁盘上的FITS图像,即它保存图像的所有像素值。该数组的类型为double。目前,我只关心单色图像 因为Cocoa不直接支持FITS格式,所以我正在使用CFITSIO库读取图像。这是可行的-我可以根据自己的意愿操纵数组,并使用库将结果保存到磁盘 但是,我现在想显示图像。我想这是NSImage或NSView可以做的。但是类引用似乎没有列出一个可以接受C数组并最终返回NSImage对象的方法。我找到的最接近的是-initWithData:(NSData*)。但我

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

因为Cocoa不直接支持FITS格式,所以我正在使用CFITSIO库读取图像。这是可行的-我可以根据自己的意愿操纵数组,并使用库将结果保存到磁盘

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

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

编辑:

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

NSBitmapImageRep*greyRep=[[NSBitmapImageRep alloc]initWithBitmapDataPlanes:nil
像素宽度
像素:高度
位示例:16
样本每像素:1
哈萨法:没有
伊斯普兰:没有
颜色空间名称:NSCalibratedWhiteColorSpace
拜特斯佩罗:0
比特像素:16];
NSInteger行字节=[greyRep bytesPerRow];
无符号短*pix=(无符号短*)[greyRep bitmapData];
NSLog(@“行字节数:%d”,行字节数);
如果(temp.bitPix==16)//16位图像
{

对于(i=0;i根据您的数据调整答案。

initWithData
仅适用于系统已经知道的图像类型。对于未知类型——以及原始像素数据——您需要自己构建图像表示。您可以按照Kirby链接到的答案中的建议,通过核心图形来实现。或者,您可以通过创建并添加一个
NSBitmapImageRep
,可以创建和添加一个
NSBitmapImageRep

确切的细节将取决于像素数据的格式,但这里有一个灰度图像处理的示例,其中源数据(采样数)在[0,1]范围内表示为双精度:

/* 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];
然后将16位值分配给像素:

if ( j % 2 )
{
    pix[i * rowBytes + j] = 0xFFFF;
}
else
{
    pix[i * rowBytes + j] = 0;
}

请注意,
rowBytes
以字节为单位,因此我们需要在
pix
中使用
unsigned char
并在赋值时强制转换,这有点难看:

if ( j % 2 )
{
    *((unsigned short*) (pix + i * rowBytes + j * 2)) = 0xFFFF;
}
else
{
    *((unsigned short*) (pix + i * rowBytes + j * 2)) = 0;
}

(我已经改变了子句的顺序,因为
==0
似乎是多余的。实际上,对于类似的东西,使用
?:
语法会更简洁,但这已经足够了。)

这是代码的解决方案。这已经扩展到支持所有3个通道。每个通道都是16位。请注意,我分配了imageArray[I]每个通道。这只是因为我目前还没有编写可以读取颜色匹配文件的代码,所以为了测试,我只是将图像分配给每个通道。结果当然是屏幕上的灰度图像。但如果需要,可以很容易地对其进行修改,以便将红色分配给红色等等

NSBitmapImageRep *colorRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
                                                                        pixelsWide:width
                                                                        pixelsHigh:height
                                                                     bitsPerSample:16
                                                                   samplesPerPixel:3
                                                                          hasAlpha:NO
                                                                          isPlanar:NO
                                                                    colorSpaceName:NSCalibratedRGBColorSpace
                                                                       bytesPerRow:(3*2*width)
                                                                      bitsPerPixel:48];

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

    for(i=0;i<height*width;++i)
    {
        *((unsigned short*)(pix + 6*i)) = imageArray[i];
        *((unsigned short*)(pix + 6*i + 2)) = imageArray[i];
        *((unsigned short*)(pix + 6*i + 4)) = imageArray[i];
    }


    NSImage *theImage = [[NSImage alloc] initWithSize:NSMakeSize(width, height)];
    [greyScale addRepresentation:colorRep];
    [myimageView setImage:theImage];
NSBitmapImageRep*colorRep=[[NSBitmapImageRep alloc]initWithBitmapDataPlanes:nil
像素宽度
像素:高度
位示例:16
样本每像素:3
哈萨法:没有
伊斯普兰:没有
colorSpaceName:NSCalibratedRGBColorSpace
bytesPerRow:(3*2*宽度)
比特像素:48];
行字节=[greyRep bytesPerRow];
NSLog(@“行字节数:%d”,行字节数);
pix=[colorRep bitmapData];

对于(i=0;我非常感谢你。我的数组只是一个双精度数组,文件可以是16位或32位。我假设,如果它是一个16位文件,我应该将整个数组除以65536,以转换数组,使其仅从0扩展到1?@Saad这当然是一个选项。请注意,从16位开始,您将失去相当多的精度到8——这对于您的目的可能无关紧要。您可能可以在初始化rep时指定16位样本,尽管我没有尝试过,也不知道这是否会对显示的结果产生任何明显的差异。该类支持16位吗?我已经将bitsPerSample设置为16,bitsPerPixel设置为16。但是,这段代码应该如果(j%2==0){pix[i*rowBytes+j]=(unsigned char)(0);}否则{pix[i*rowBytes+j]=(unsigned char)(255);}
@Saad看起来确实支持16。请参阅上面的更新以了解经验
if ( j % 2 )
{
    pix[i * rowBytes + j] = 0xFFFF;
}
else
{
    pix[i * rowBytes + j] = 0;
}
if ( j % 2 )
{
    *((unsigned short*) (pix + i * rowBytes + j * 2)) = 0xFFFF;
}
else
{
    *((unsigned short*) (pix + i * rowBytes + j * 2)) = 0;
}
NSBitmapImageRep *colorRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
                                                                        pixelsWide:width
                                                                        pixelsHigh:height
                                                                     bitsPerSample:16
                                                                   samplesPerPixel:3
                                                                          hasAlpha:NO
                                                                          isPlanar:NO
                                                                    colorSpaceName:NSCalibratedRGBColorSpace
                                                                       bytesPerRow:(3*2*width)
                                                                      bitsPerPixel:48];

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

    for(i=0;i<height*width;++i)
    {
        *((unsigned short*)(pix + 6*i)) = imageArray[i];
        *((unsigned short*)(pix + 6*i + 2)) = imageArray[i];
        *((unsigned short*)(pix + 6*i + 4)) = imageArray[i];
    }


    NSImage *theImage = [[NSImage alloc] initWithSize:NSMakeSize(width, height)];
    [greyScale addRepresentation:colorRep];
    [myimageView setImage:theImage];