如何在单触后通过CGBitmapContext组合两个图像时避免质量损失

时间:2012-12-20 17:02:44

标签: iphone ios xamarin.ios core-graphics

我有两张照片。第一个(avatar)是640x640,第二个(like)是21x20。 当我第一次尝试绘制第二个时,我得到它,但质量非常低。 这是代码:

var bounds = targeImageView.Bounds;
CGImageAlphaInfo alphaInfo = CGImageAlphaInfo.PremultipliedLast;
CGColorSpace colorSpaceInfo = CGColorSpace.CreateDeviceRGB ();
CGBitmapContext resultBitmap = new CGBitmapContext (IntPtr.Zero, (int)bounds.Width, (int)bounds.Height, 8, 4 * (int)bounds.Width, colorSpaceInfo, alphaInfo);
resultBitmap.DrawImage (bounds, avatar.CGImage);
var likeY = 0;
var likeX = 0;
var likeHeight = (float)Math.Floor (bounds.Height / 2);
var likeWidth = likeHeight;
resultBitmap.DrawImage (new RectangleF (likeX, likeY, likeWidth, likeHeight), like.CGImage);
targetImageView.Image = UIImage.FromImage (resultBitmap.ToImage ());

以下是同一图片视图中的avatar图片,但没有高级代码,只有imageView.Image = avatar;

avatar

这是相同的但是在绘制之后。

enter image description here

2 个答案:

答案 0 :(得分:1)

你的视力比我好 - 至少在那么小的范围内。如果它是一个视网膜问题(我想是这样),那么下面的代码应该可以帮助你,因为它创建了一个上下文,可以将自己调整为视网膜(或不显示)。

UIImage avatar = ...;
UIImage like = ...;
UIGraphics.BeginImageContextWithOptions (avatar.Size, false, 0);
using (CGContext ctx = UIGraphics.GetCurrentContext ()) {
    var rect = new RectangleF (Point.Empty, avatar.Size);
    avatar.Draw (rect);
    // coordinates are likely reversed (UIKit wrt CoreGraphics) you might have to fix them (untried)
    rect = new RectangleF (0, avatar.Height / 2, avatar.Width / 2, avatar.Height / 2);
    like.Draw (rect);

    targetImageView.Image = UIGraphics.GetImageFromCurrentImageContext ();
    UIGraphics.EndImageContext ();
    // dispose of avatar and like UIImage if not used anymore
}

答案 1 :(得分:1)

  1. 使用PNG,它们是无损的,质量比JPG或Bitmap好。

      

    NSData * imageData = UIImagePNGRepresentation(image);

         

    UIImage * image = [UIImage imageWithData:data];

  2. 使用CGRectMake()为框架分配UIImageView以进行放置。您可以将图像浮动到任何您想要的位置。

  3. 使用[ImageView setImage:...]

  4. 设置ImageView的图像
  5. 图像将变得更清晰,您可以完全控制质量和位置。

  6. 我使用压缩到15px x 15px的256幅图像,它仍保持非常好的形状。相比之下,我也反过来拉伸图像。