3

ユーザーが写真を撮ってからグレースケールバージョンを表示できるようにしたいと思います。ただし、画像ファイルが大きすぎる/解像度が高すぎるため、非常に遅くなります。

ユーザーが写真を撮るときに画像の品質を下げるにはどうすればよいですか?

変換に使用しているコードは次のとおりです。

    - (UIImage *)convertImageToGrayScale:(UIImage *)image
{
    // Create image rectangle with current image width/height
    CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
    // Grayscale color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    // Create bitmap content with current image size and grayscale colorspace
    CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone);
    // Draw image into current context, with specified rectangle
    // using previously defined context (with grayscale colorspace)
    CGContextDrawImage(context, imageRect, [image CGImage]);
    /* changes start here */
    // Create bitmap image info from pixel data in current context
    CGImageRef grayImage = CGBitmapContextCreateImage(context);
    // release the colorspace and graphics context
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);
    // make a new alpha-only graphics context
    context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, nil, kCGImageAlphaOnly);
    // draw image into context with no colorspace
    CGContextDrawImage(context, imageRect, [image CGImage]);
    // create alpha bitmap mask from current context
    CGImageRef mask = CGBitmapContextCreateImage(context);
    // release graphics context
    CGContextRelease(context);
    // make UIImage from grayscale image with alpha mask
    UIImage *grayScaleImage = [UIImage imageWithCGImage:CGImageCreateWithMask(grayImage, mask) scale:image.scale orientation:image.imageOrientation];
    // release the CG images
    CGImageRelease(grayImage);
    CGImageRelease(mask);
    // return the new grayscale image
    return grayScaleImage;
    /* changes end here */
}
4

2 に答える 2

2

AVFoundationを使用して画像をキャプチャしている場合は、次のようにキャプチャセッションプリセットを変更することで、キャプチャする画像の品質を設定できます。

AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetLow;

AVFoundationプログラミングガイドには、どのプレゼンテーションがどの解像度に対応するかを示す表があります。

于 2012-07-26T16:38:13.570 に答える
2

UIImageをグレースケール変換に渡す前にダウンサンプリングするのはどうですか?何かのようなもの:

NSData *imageAsData = UIImageJPEGRepresentation(imageFromCamera, 0.5);
UIImage *downsampledImaged = [UIImage imageWithData:imageAsData];

もちろん、0.5以外の他の圧縮品質を使用することもできます。

于 2012-07-26T16:40:01.027 に答える