Эмуляция NSImage drawInRect: fromRect: операция: дробь с UIImage - PullRequest
2 голосов
/ 21 февраля 2010

Мне действительно нужно эмулировать поведение drawInRect: fromRect: operation: фракция NSImage с использованием UIImage, и мне интересно, каков наилучший подход или (лучше), если кто-то уже сделал это и готов поделиться кодом.

Я пытался сделать это с помощью CGImageCreateWithImageInRect (см. Код в конце), но я не получаю ожидаемых результатов. Обратите внимание, что код на самом деле тестирует это на Mac (сейчас я не могу запустить все это на iPhone), поэтому у меня могут возникнуть проблемы с получением CGImage из NSImage

- (void)drawInRect:(CGRect)rect fromRect:(CGRect)fromRect alpha:(float)alpha {
      CGContextRef context;
       CGImageRef originalImageRef;
       CGImageRef subimageRef;

#if ERMac
       context=[[NSGraphicsContext currentContext] graphicsPort];

       CGImageSourceRef source;

       source = CGImageSourceCreateWithData((CFDataRef)[self TIFFRepresentation], NULL);
       originalImageRef =  CGImageSourceCreateImageAtIndex(source, 0, NULL);
       CFRelease(source);
#else
       context=UIGraphicsGetCurrentContext();
       originalImageRef=CGImageRetain([self CGImage]);
#endif

       subimageRef = CGImageCreateWithImageInRect (originalImageRef, fromRect);


       CGContextDrawImage(context, rect, subimageRef);


       if (subimageRef)
           CGImageRelease(subimageRef);
       if (originalImageRef)
           CGImageRelease(originalImageRef);
 }

Ответы [ 2 ]

2 голосов
/ 17 сентября 2013

Вот как я это делаю ...

- (void)drawInRect:(CGRect)drawRect fromRect:(CGRect)fromRect operation:(CGBlendMode)blendMode fraction:(CGFloat)alpha
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextClipToRect(context, drawRect);

    CGFloat xScale = (drawRect.size.width/fromRect.size.width);
    CGFloat yScale = (drawRect.size.height/fromRect.size.height);

    CGFloat scale = 1;
    if([self respondsToSelector:@selector(scale)])
    {
        scale = self.scale;
    }

    CGFloat actualWidth = (xScale * self.size.width)*scale;
    CGFloat actualHeight = (yScale * self.size.height)*scale;
    CGFloat xInset = fromRect.origin.x * xScale;
    CGFloat yInset = fromRect.origin.y * yScale;

    // Take care of Y-axis inversion problem by translating the context on the y axis
    CGContextTranslateCTM(context, 0, drawRect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(-xInset + drawRect.origin.x, -yInset + drawRect.origin.y, actualWidth, actualHeight), self.CGImage);

    CGContextRestoreGState(context);
}
0 голосов
/ 10 февраля 2011

UIImage имеет drawInRect: blendMode: alpha :. Простая уловка для извлечения под прямоугольника UIImage состоит в том, чтобы нарисовать в целевом контексте, который является размером прямоугольника, который вы хотите извлечь, корректируя источник нарисованного изображения вверх и влево так, чтобы правая часть падала в цель контекст.

CGImage также является хорошим способом сделать это, но вы можете столкнуться с проблемами при переворачивании системы координат на iPhone. Простое решение - обернуть CGImage в UIImage и нарисовать его, так как UIImage знает, каким способом рисовать вверх.

...