2010-09-22 64 views
2

我有一个PDF渲染到一个非常高的分辨率的图像(比如高达甚至超过10万* 80000像素)。方法来呈现一个PDF到一个非常高的分辨率NSImage中的位图文件

我设法做到这一点,没有走出内存通过将渲染分成几个切片,然后使用NSOperationQueue渲染每一个,基本上使用drawInRect绘制NSImage pdf表示到一个新的NSImage:fromRect:operation:fraction:然后将TIFFRepresentation保存到文件中。

所有这些都是好的和多核和快速,我几乎高兴。 无论如何,我需要在渲染它们之后再次加入这些切片,以获得单个TIFF文件。

我会尝试合并文件使用NSInputStream和NSOutputStream,但由于每个文件是一个完整的TIFF表示,合并原始字节将导致一个不可读的图片文件。 有没有办法将图像文件合并到一起,而不需要将它们完全加载到内存中,即不使用NSImage方法?

否则,我可以保存原始像素字节而不是tiff表示,然后将它们与NSInputStream/NSOutputStream结合起来,但是如何将整个字节文件转换为可识别的TIFF,而无需再将巨大的内容加载到内存中?

+0

我很好奇,为什么你需要一个像如此之大 - 什么样的PDF的可能有那么多信息?另一种选择是使用我在下面概述的技术提取比想要的分辨率(100MB - 1GB未压缩)低的图像,然后使用一些照片编辑应用程序将其缩放到较大的尺寸。这可能会给你几乎相同的图像。我很想听听你的申请是什么! – 2010-11-24 02:26:04

+0

该应用程序是关于将矢量图形栅格化为非常大的位图以创建高分辨率壁纸大小的打印件。印刷厂需要tiff图像,并且无法直接处理矢量图形。它必须在编码中完成,而不是手动使用Cocoa API。 – 2010-11-24 09:47:20

回答

-1

这种技术可能不会对您的极端要求的工作(见消息的末尾更上),但它希望能帮助其他人获得更高的清晰度图片从PDF比他们可以用一个屏幕截图或快照acrobat工具。这不是特别优雅,但它完成了工作。基于9的Acrobat阅读器

说明在Windows XP(早期及以后的版本也应该只要他们有快照/“选取框选择”工具工作)。我想它适用于运行Adobe Reader的大多数其他平台。 (现在,我想它也很可能替代PDF显示软件,可实际上只是做到这一点没有任何技巧基于ghostscript的或许真的?)在任何情况下,我知道这个工程:

  1. 放大直到你的显示器上的图像具有你正在寻找的像素分辨率。如果您尝试捕捉的图像像素超过显示器上的像素(这是使用此技术的唯一原因),则只能在屏幕上看到图像的一部分。
  2. 根据需要滚动找到想要捕捉的PDF的一个角落。
  3. 选择快照/“选框选择”工具。
  4. 单击该角,按住鼠标按钮(拖动选择)并将鼠标移动到窗口的对角。
  5. 屏幕将开始自动滚动到图像的对角。这可能需要一段时间,但它会到达那里。
  6. 当你到对面的边缘,手指离开鼠标,你应该在你的剪贴板上的高分辨率图像。现在

,取决于初始图像的“大小”(Acrobat将只放大至基于PDF的DPI信息的原始尺寸的6400%),这种技术可以理论上让你达到100k x 80k像素。凡分崩离析大多数当今PC的是,你需要足够的内存来保存22GB在复制缓冲区的图像数据的...

+0

啊哈,我很抱歉,但如果你仔细阅读这个问题,你会发现,这是有关使用可可的API,而不是使用Acrobat否则...... – 2010-11-24 09:45:31

+0

真正的手工做编程的方法,但是如果你看我的我认识到它可能不会满足你的需求。我希望我的反应/方法可能对一些基于更普遍的主题而发生(如我一样)偶然发现的人有用,并且不介意一点体力劳动。 – 2010-11-24 21:42:28

相关问题