当前位置: 首页 > 知识库问答 >
问题:

在cocoa osx中将位图图像复制到粘贴板时出现问题

鲁向明
2023-03-14

我正在编写一个计算位图图像的图像处理应用程序。它在多个窗口中显示它们,我希望能够将图像复制到粘贴板。每个窗口都有自己的控制器(NSWindowController的子类)和ImageView(NSImageView的子类)。

我的代码将成功地从最近显示的窗口中复制图像,但是当我从以前显示的窗口中复制图像时,给出了EXC _坏_访问(代码1)。

窗口控制器中用于设置位图图像的代码如下:

-(void) placeImage:(NSRect) theRect{
    windowRect = theRect;
    [[self window] setTitle:windowName];

    NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc]
                                initWithBitmapDataPlanes: iBitmap.getpixdatap()
                                pixelsWide: iBitmap.getwidth() pixelsHigh: iBitmap.getheight()
                                bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES isPlanar:NO
                                colorSpaceName:NSCalibratedRGBColorSpace
                                bytesPerRow: 4*iBitmap.getwidth()
                                bitsPerPixel: 32];

    NSImage* im = [[NSImage alloc] initWithSize:NSMakeSize(iBitmap.getwidth(), iBitmap.getheight())];
    [im addRepresentation:bitmap];

    //NSImage* im = [[NSImage alloc] initByReferencingFile:@"./Contents/Resources/curve.jpg"];

    NSRect rect = NSMakeRect(0, 0, windowRect.size.width,windowRect.size.height-TITLEBAR_HEIGHT);
    [imageView setFrame:rect];
    [imageView setImageScaling:NSScaleToFit];
    [imageView setImage:im];
    [imageView display];

}

对于复制操作:

- (IBAction)copy:sender {
    NSImage *image = [imageView image];
    if (image != nil) {
        NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
        [pasteboard clearContents];
        NSArray *copiedObjects = @[image];
        [pasteboard writeObjects:copiedObjects];
    }
}

如果我将位图图像替换为jpeg文件中的图像(在上面的placeImage中注释了一行),那么任何窗口的复制都是成功的。如有任何建议,我们将不胜感激。

堆栈帧如下所示:

0 _platform_memmove$VARIANT$Nehalem

1个vImageCopyBuffer

2复制_转换

3 AnyToAnyBiock

4 vImageConvert_任意

5转换器字节范围

6 _CGimagePiuginWriteTIFF

7 CGImageOestinationFinalize

8[NSBitmaplmageRep(NSBitmaplmageFileTypeExence)表示OflmageRepslnArray: usingType: Estate:]

9-[NStmage TIFF表示使用压缩:事实:]

10 -[NS图像粘贴板属性列表类型:]

11-[NSPasteboard writeObjects:]

12-[DataWindowController副本:]

13-[应用程序发送操作:收件人:发件人:]

14-[NSMenultema_corePerformAction]

15-[NSCarbonMenulmpl performactionwithhightingfortematlndex:]

16-[NS菜单性能等效键:]

17-[NSApplication _ handle key equivalent:]

18-[NSApplication sendEvent:]

19 -[NS 应用程序运行]

20 N主应用程序

21 主要

22 开始

共有1个答案

姜锋
2023-03-14

这显然是内存管理问题。这里有有用的信息:问题16094748

用nil初始化位图数据平面,然后显式复制数据似乎可以解决问题。

-(void) placeImage:(NSRect) theRect{
    windowRect = theRect;
    [[self window] setTitle:windowName];

    NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc]
                                initWithBitmapDataPlanes: nil
                                pixelsWide: iBitmap.getwidth() pixelsHigh: iBitmap.getheight()
                                bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES isPlanar:NO
                                colorSpaceName:NSCustomColorSpace
                                bytesPerRow: 4*iBitmap.getwidth()  
                                bitsPerPixel: 32];

    memcpy([bitmap  bitmapData], iBitmap.getpixdata(), iBitmap.getheight()*iBitmap.getwidth()*4);

    NSImage* im = [[NSImage alloc] initWithSize:NSMakeSize(iBitmap.getwidth(), iBitmap.getheight())];
    [im addRepresentation:bitmap];

    //NSImage* im = [[NSImage alloc] initByReferencingFile:@"./Contents/Resources/curve.jpg"];

    NSRect rect = NSMakeRect(0, 0, windowRect.size.width,windowRect.size.height-TITLEBAR_HEIGHT);
    [imageView setFrame:rect];
    [imageView setImageScaling:NSScaleToFit];
    [imageView setImage:im];
    [imageView display];

}
 类似资料:
  • 我想从URL中复制image/gif而不下载它,例如,我想将此gif复制到剪贴板https://media.gify.com/media/l49jl8rj2voexlmm0/giphy.gif并将此gif粘贴到此站点https://paste.pics/ 我试了所有的办法,但都没用。 代码试用:复制到剪贴板: 粘贴1 粘贴2 所以我不知道该怎么做,请协助

  • 问题内容: 首先,关于SO将图像复制到python中的剪贴板的问题导致答案用PIL和win32clipboard将图像写入python中的Windows剪贴板?,这仅对Python 2.x有用。-我尝试过,但是没有用。我克服了一个问题:Python 3.0中没有StringIO和cStringIO模块 ,但是碰到了另一个: 因此,对于Python 3再次提出相同的问题-如何在Python 3中将图

  • 本文向大家介绍js实现点击图片将图片地址复制到粘贴板的方法,包括了js实现点击图片将图片地址复制到粘贴板的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现点击图片将图片地址复制到粘贴板的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 我可以假设Mac OS X剪贴板图像数据是png吗? 当我尝试MIME检测剪贴板数据时,它返回。 这会导致每个浏览器下载图像而不是显示图像。 如果我强制将内容类型设置为image/png,一切看起来都很好,但我想知道是否有一种方法可以让我不必做出这样的假设? 我用https://github.com/broofa/node-mime检测MIME类型。

  • 我有几个Excel图表,我想用Python导出为图像。每个图表都在一个单独的Excel文件中,只有一张工作表。此脚本适用于几乎所有我的图表: 我有一个图表,但是不能导出...我得到这个错误后导出函数: 图表被复制到临时工作表,但导出失败。在一些为导出此图表而编写的旧Excel-VBA代码中,我看到这一行: Python的等价物是什么?这: 不工作(属性错误:对象没有属性'Paste特殊') 编辑-

  • 问题是,从vim到剪贴板的复制/粘贴停止工作。我不知道为什么。。。 在中,我也没有看到和缓冲区... 这是我的。vimrc,如果需要的话。 有什么建议吗? 谢谢

  • 问题内容: 我正在寻找一个如何将文本复制到iOS剪贴板的干净示例,然后可以在其他应用程序中使用/粘贴该文本。 此功能的优点是可以快速复制文本,而无需传统文本复制的标准文本突出显示功能。 我假设键类在其中,但是在它们提供的代码示例中找不到相关的区域。 问题答案: 如果您只需要纯文本,则可以使用属性。它既可读又可写: (从剪贴板中 读取数据时 ,UIPasteboard文档还建议您首先检查一下,“以避

  • 这与这个问题非常相似,但尚未得到回答。 我从PyCharm启动了一个Jupyter服务器。我创建了一个截图,并将其复制并粘贴到Jupyter Notebook中。图像没有以其他方式保存。在Jupyter Notebook中,图像显示为这样:,我可以在Jupyter服务器上看到图像,但在PyCharm中看不到笔记本文件中的图像。我找不到文件存储在哪里。我查看了笔记本所在的文件夹,并使用文件资源管理器