указание CGRect для захвата изображения (iPhone) - PullRequest
1 голос
/ 20 марта 2011

У меня есть немного кода, который я получил из интернета, чтобы захватить снимок экрана с рулона камеры, он прекрасно работает, вот он:

 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;
}

хорошо, прямоугольник, который я получаю вФотопленка имеет размер, который я определяю, но его происхождение, кажется, (0,0) ... возможно, это [self.view.layer renderInContext: ctx]; ??

, если кто-то может помочьбезусловно, был бы признателен, большое спасибо:)

1 Ответ

2 голосов
/ 20 марта 2011

Джефф, просто объяснение того, что там происходит:

"ctx" делает маленькую "внеэкранную рабочую область".

Думайте об этом как о блокноте или блокноте...

ОК?

Фактически, "ctx" позволяет вам ссылаться на этот блокнот или блокнот.

Теперь вы спрашиваете, насколько велик этот блокнот?Фактически, оригинальный разработчик кода сделал этот эскизный блок того же размера, что и текущий экран.

Обратите внимание, что переменная, которая называется "screenRect", имеет неправильное имя .Он должен называться howBigWillOurSketchBlockBe.

Имеет смысл до сих пор?

Итак, сначала пройдите код и измените screenRect на howBigWillOurSketchBlockBe.Все сделано.

Теперь - как вы можете видеть, все, что вы делаете с новым кодом, - это изменение размера блокнота .

Имеет смысл?

Теперь вы видите строку с надписью "renderInContext" ... которая берет первое упомянутое, вместо self.view.layer, и отображает его в блоке эскизов .

Конечно, он начинает использовать нижний левый угол self.view.layer.

Поскольку ваш блок эскизов теперь довольно мал (посмотрите на вашу переменную howBigWillOurSketchBlockBe), и вы увидите, что происходит!

Итак, важно понять, что "howBigWillOurSketchBlockBe" (ранее был плохо назван "screenRect") - это просто и только РАЗМЕР СКЕТЧБЛОКА , который вы настроили для рисования.1039 *

Так что теперь вы задаетесь вопросом, как решить проблему!Я думаю, вам нужно будет посмотреть на петуха на этой странице,

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

Помогает ли применение небольшого преобразования?CGContextTranslateCTM ...

Надеюсь, это поможет!

...