kCAFilterNearest maginifcation filter (UIImageView) - PullRequest
2 голосов
/ 01 июля 2011

Я использую библиотеку QREncoder, найденную здесь: https://github.com/jverkoey/ObjQREncoder

По сути, я посмотрел пример кода этого автора, и когда он создает QRCode, он получается идеально без пикселизации.Само изображение, которое предоставляет библиотека, имеет размер 33 x 33 пикселя, но он использует kCAFilterNearest для увеличения и повышения четкости изображения (без пикселизации).Вот его код:

    UIImage* image = [QREncoder encode:@"http://www.google.com/"];

    UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
  CGFloat qrSize = self.view.bounds.size.width - kPadding * 2;
    imageView.frame = CGRectMake(kPadding, (self.view.bounds.size.height - qrSize) / 2,
    qrSize, qrSize);
    [imageView layer].magnificationFilter = kCAFilterNearest;

    [self.view addSubview:imageView];

У меня есть UIImageView в xib, и я устанавливаю его изображение так:

[[template imageVQRCode] setImage:[QREncoder encode:ticketNum]];
[[[template imageVQRCode] layer] setMagnificationFilter:kCAFilterNearest];

, но код qrcode действительно размытый.В примере это получается кристально чистым.Что я делаю неправильно?Спасибо!

ОБНОВЛЕНИЕ: Я обнаружил, что проблема не в масштабировании и не в том, что связано с kCAFFilterNearest.Это связано с генерацией PNG-изображения из вида. Вот как оно выглядит на изображении и как оно выглядит, когда я сохраняю UIView в представление PNG (обратите внимание на качество QRCodes):

enter image description here

ОБНОВЛЕНИЕ 2: Вот как я генерирую файл PNG из UIView:

   UIGraphicsBeginImageContextWithOptions([[template view] bounds].size, YES, 0.0);
    [[[template view] layer] renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [UIImagePNGRepresentation(viewImage) writeToFile:plistPath atomically:YES];

1 Ответ

0 голосов
/ 03 марта 2012

Я использовал приведенную ниже функцию для редактирования изображения.

- (UIImage *)resizedImage:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)quality
{
    BOOL drawTransposed;

    switch (self.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            drawTransposed = YES;
            break;

        default:
            drawTransposed = NO;
    }

    return [self resizedImage:newSize
                    transform:[self transformForOrientation:newSize]
               drawTransposed:drawTransposed
         interpolationQuality:quality];

}

- (UIImage *)resizedImage:(CGSize)newSize
                transform:(CGAffineTransform)transform
           drawTransposed:(BOOL)transpose
     interpolationQuality:(CGInterpolationQuality)quality
{

    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
    CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width);
    CGImageRef imageRef = self.CGImage;

    // Build a context that's the same dimensions as the new size
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
    if((bitmapInfo == kCGImageAlphaLast) || (bitmapInfo == kCGImageAlphaNone))
        bitmapInfo = kCGImageAlphaNoneSkipLast;

    CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                                newRect.size.width,
                                                newRect.size.height,
                                                CGImageGetBitsPerComponent(imageRef),
                                                0,
                                                CGImageGetColorSpace(imageRef),
                                                bitmapInfo);

    // Rotate and/or flip the image if required by its orientation
    CGContextConcatCTM(bitmap, transform);

    // Set the quality level to use when rescaling
    CGContextSetInterpolationQuality(bitmap, quality);

    // Draw into the context; this scales the image
    CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef);

    // Get the resized image from the context and a UIImage
    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    // Clean up
    CGContextRelease(bitmap);
    CGImageRelease(newImageRef);

    return newImage;

}


UIImageWriteToSavedPhotosAlbum([image resizedImage:CGSizeMake(300, 300) interpolationQuality:kCGInterpolationNone], nil, nil, nil);

Пожалуйста, найдите изображение ниже и дайте мне знать, если вам нужна помощь.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...