Iphone 在monotouch中通过CGBitmapContext组合两幅图像时如何避免质量损失

Iphone 在monotouch中通过CGBitmapContext组合两幅图像时如何避免质量损失,iphone,ios,xamarin.ios,core-graphics,Iphone,Ios,Xamarin.ios,Core Graphics,我有两张照片。第一个(avatar)是640x640,第二个(like)是21x20。 当我试图在第一名上画第二名时,我得到了它,但质量很低。 代码如下: var bounds = targeImageView.Bounds; CGImageAlphaInfo alphaInfo = CGImageAlphaInfo.PremultipliedLast; CGColorSpace colorSpaceInfo = CGColorSpace.CreateDeviceRGB (); CGBitmap

我有两张照片。第一个(
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

这里是相同的,但在绘图之后


你的视力比我好——至少是这么小的尺寸。如果是视网膜问题(我想是的),那么下面的代码应该可以帮助您创建一个上下文,它可以根据视网膜(或非视网膜)显示进行自我调整

  • 使用PNG它们是无损的,并且比JPG或位图质量更好

    NSData*imageData=UIImagePNGRepresentation(图像)

    UIImage*image=[UIImage imageWithData:data]

  • 使用CGRectMake()为UIImageView分配要放置的帧。您将能够将图像浮动到您想要的任何位置

  • 使用[ImageView setImage:…]设置ImageView的图像

  • 图像将被渲染得更清晰,并且您可以完全控制质量和位置


  • 我使用了一个256像素的图像压缩到15px x 15px,它仍然保持着非常好的形状。相比之下,我还以相反的方式拉伸了图像。

    您附加的位图太小,即我看不到它们之间的质量差异。你能放大吗?和/或描述质量问题?e、 第二张照片上可能没有使用视网膜(而是加倍像素)吗?请仔细看,有区别。我甚至可以在那篇文章中看到它,而不用单独打开它。是的,考虑到视网膜,这就是iphone视网膜模拟器。@poupou:左图中人的头发差异最为明显。提问者正在将一幅图像合成到另一幅图像上;哪一部分与“使用PNG”相关?至于其他三个步骤,它们似乎是如何显示图像的建议,但提问者希望合成两个图像。你的建议如何执行提问者的任务?还有,你的建议与发问者的最后一行代码有什么不同?@Peter:我对这个问题的理解是使用第一个图像(化身)并添加子图像(笑脸和云),如所提供的示例中所示,向用户“呈现”一个统一的外观。我的建议是将它们分层,并为用户提供可以表示任意数量配置的堆叠图像。例如可以控制开/关的徽章或云等,增加数字等。通过实际嵌入图像,新的单个图像被粘在一起。“你们可以在容器UIView中循环并捕捉所有子图像的图像,以备以后使用。”Peter继续说,“若应用程序想在头像上使用分层的“云”来表示用户已“连接”,那个么分层透明的高质量PNG会有更大的灵活性。”,而不是在位图级别将它们拼接在一起。但是,如果客户端应用程序绝对需要将两个图像作为一个嵌入到一起,那么“你是正确的”,那么我的回答不支持这种努力。如果是这样,我很抱歉,也许这会帮助其他人。
    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
    }