开发者

Low quality MKMapView Dynamically Generated Image

Before anyone points me at this post, I've already tried it, and it doesn't work for me. I am trying to generate a black and white snapshot of an MKMapView. The quality, however, is terribly low on the iPhone 4. Here is my code. Anyone have any suggestions?

- (void)mapSnapShotWithMapView:(MKMapView *)_mapView {
    CGSize s 开发者_JS百科= CGSizeMake(_mapView.bounds.size.width, _mapView.bounds.size.height);
    UIGraphicsBeginImageContextWithOptions(s, NO, 0.0f);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[_mapView layer] renderInContext:ctx];
    UIImage *thumb = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    ctx = CGBitmapContextCreate(nil, s.width, s.height, 8, s.width, colorSpace, kCGImageAlphaNone);
    CGContextSetShouldAntialias(ctx, YES);
    CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);

    CGContextDrawImage(ctx, CGRectMake(0, 0, s.width, s.height), thumb.CGImage);
    CGImageRef bwImage = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);
    CGColorSpaceRelease(colorSpace);

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, s.width, s.height)];
    [imageView setImage:[UIImage imageWithCGImage:bwImage]];
    CGImageRelease(bwImage);
    [self.view addSubView:imageView];
    [imageView release];
}


I figured it out thanks to this post. It was not using the iPhone's native resolution, even though 0.0f as the last parameter of UIGraphicsBeginImageContextWithOptions should do this. Regardless, here is the updated code:

- (void)mapSnapShotWithMapView:(MKMapView *)_mapView {
  CGSize s = _mapView.bounds.size;
  CGFloat scale = 1.0;
  if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    scale = [[UIScreen mainScreen] scale];
    s = CGSizeApplyAffineTransform(s, CGAffineTransformMakeScale(scale, scale));
  }

  UIGraphicsBeginImageContextWithOptions(s, NO, 1.0f);
  CGContextRef ctx = UIGraphicsGetCurrentContext();
  CGContextScaleCTM(ctx, scale, scale);
  [[_mapView layer] renderInContext:ctx];
  UIImage *thumb = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
  ctx = CGBitmapContextCreate(nil, s.width, s.height, 8, s.width, colorSpace, kCGImageAlphaNone);
  CGContextSetShouldAntialias(ctx, YES);
  CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);

  CGContextDrawImage(ctx, CGRectMake(0, 0, s.width, s.height), thumb.CGImage);
  CGImageRef bwImage = CGBitmapContextCreateImage(ctx);
  CGContextRelease(ctx);
  CGColorSpaceRelease(colorSpace);

  UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, s.width/2, s.height/2)];
  [imageView setImage:[UIImage imageWithCGImage:bwImage]];
  CGImageRelease(bwImage);
  [self.view addSubview:imageView];
  [imageView release];
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜