1

我有一些从互联网上下载的代码,用于将屏幕截图抓取到相机胶卷上,效果很好,这里是:

 CGRect screenRect = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.bounds.size.width, self.view.bounds.size.height);
UIGraphicsBeginImageContext(screenRect.size);

CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor blackColor] set];
CGContextFillRect(ctx, screenRect);

[self.view.layer renderInContext:ctx];

UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
UIImageWriteToSavedPhotosAlbum(screenImage, nil, nil, nil);
UIGraphicsEndImageContext();

一切都适用于 iPhone,但现在我为 iPad 进行了更改,我需要捕获与整个屏幕不同的矩形,所以我指定了一个不同的矩形,如下所示:

CGRect screenRect;
switch (runningOniPad) {
    case 0: // running on iPhone..
        screenRect = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.bounds.size.width, self.view.bounds.size.height);
        break;

    default: // yes, running on iPad..
        screenRect = CGRectMake(56, 478, 662, 262);

        break;
}

好吧,我在相机胶卷中得到的矩形是我指定的 SIZE,但它的原点似乎是(0,0)......也许它是 [self.view.layer renderInContext:ctx];??

如果有人可以提供帮助,我将不胜感激,非常感谢:)

4

1 回答 1

2

杰夫,只是对那里发生的事情的解释:

“ctx”是一个小小的“屏幕外工作区”。

把它想象成一个记事本或草图块......

好的?

事实上,“ctx”让您可以引用该记事本或草图块。

现在你问,这个草图块有多大?事实上,最初的代码编写者使该草图块与当前屏幕的大小相同。

请注意,名为“screenRect”的变量命名错误。它应该被称为 howBigWillOurSketchBlock 。

到目前为止有意义吗?

所以,首先通过代码将screenRect更改为howBigWillOurSketchBlockBe。全部做完。

现在 - 正如您现在所看到的,您对新代码所做的所有事情都是更改 sketchblock 的大小

说得通?

现在,您会看到写着“renderInContext”的行……它将提到的第一件事与 self.view.layer 相提并论,并将其渲染到您的 sketchblock 中

当然,它开始使用 self.view.layer 的左下角。

由于您的草图块现在非常小(查看变量 howBigWillOurSketchBlockBe),您将看到发生了什么!

所以要理解的重要一点是,“howBigWillOurSketchBlockBe”(以前命名为“screenRect”)很简单,只是您设置要涂鸦的 SKETCHBLOCK 的 SIZE 。

所以现在你想知道如何解决这个问题!我想你需要看看这个页面上的公鸡,

http://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html

应用一点变换有帮助吗?CGContextTranslateCTM ...

希望能帮助到你!

于 2011-03-20T09:06:04.620 回答