MonoTouch,在 UIImageView 上绘制裁剪区域层
Posted
技术标签:
【中文标题】MonoTouch,在 UIImageView 上绘制裁剪区域层【英文标题】:MonoTouch, drawing a cropping region layer over a UIImageView 【发布时间】:2012-12-06 10:52:18 【问题描述】:在我们的应用程序中,我们希望能够裁剪、缩放和平移图像,但我似乎无法弄清楚应该如何在 UIImageView 上绘制裁剪区域。
我尝试使用 coregraphics,我可以在图像上渲染一个带有黑色笔划的区域,但图像会翻转。不仅如此,因为我已经在图像上绘制了,我担心如果我用手势移动和缩放它,该区域也会受到影响!
我们将不胜感激!
这是我的代码,它并没有真正做到我想要的,以展示一些研究工作。
// Aspect ration - Currently 1:1
const int arWidth = 1;
const int arHeight = 1;
UIGraphics.BeginImageContext(ImgToCrop.Frame.Size);
var context = UIGraphics.GetCurrentContext();
// Set the line width
context.SetLineWidth(4);
UIColor.Black.SetStroke();
// Our starting points.
float x = 0, y = 0;
// The sizes
float width = ImgToCrop.Frame.Width, height = ImgToCrop.Frame.Height;
// Calculate the geometry
if(arWidth == arHeight)
// The aspect ration is 1:1
width = ImgToCrop.Frame.Width;
height = width;
x = 0;
y = ImgToCrop.Frame.GetMidY()-height/2;
// The rect
var drawRect = new RectangleF(x,y,width,height);
context.DrawImage(new RectangleF(
ImgToCrop.Frame.X,
ImgToCrop.Frame.Y,
ImgToCrop.Frame.Width,
ImgToCrop.Frame.Height),ImgToCrop.Image.CGImage);
// Draw it
context.StrokeRect(drawRect);
ImgToCrop.Image = UIGraphics.GetImageFromCurrentImageContext();
【问题讨论】:
【参考方案1】:也许这会对你有所帮助:
public static UIImage ScaleToSize (UIImage image, int width, int height)
UIGraphics.BeginImageContext (new SizeF (width, height));
CGContext ctx = UIGraphics.GetCurrentContext ();
float ratio = (float) width / (float) height;
ctx.AddRect (new RectangleF (0.0f, 0.0f, width, height));
ctx.Clip ();
var cg = image.CGImage;
float h = cg.Height;
float w = cg.Width;
float ar = w / h;
if (ar != ratio)
// Image's aspect ratio is wrong so we'll need to crop
float scaleY = height / h;
float scaleX = width / w;
PointF offset;
SizeF crop;
float size;
if (scaleX >= scaleY)
size = h * (w / width);
offset = new PointF (0.0f, h / 2.0f - size / 2.0f);
crop = new SizeF (w, size);
else
size = w * (h / height);
offset = new PointF (w / 2.0f - size / 2.0f, 0.0f);
crop = new SizeF (size, h);
// Crop the image and flip it to the correct orientation (otherwise it will be upside down)
ctx.ScaleCTM (1.0f, -1.0f);
using (var copy = cg.WithImageInRect (new RectangleF (offset, crop)))
ctx.DrawImage (new RectangleF (0.0f, 0.0f, width, -height), copy);
else
image.Draw (new RectangleF (0.0f, 0.0f, width, height));
UIImage scaled = UIGraphics.GetImageFromCurrentImageContext ();
UIGraphics.EndImageContext ();
return scaled;
【讨论】:
谢谢,但恐怕它不能回答我关于裁剪区域的问题 - 所需的结果是覆盖图像的裁剪区域,可用于在发生了种植。但我也许可以使用你的裁剪代码,所以 +1! 哦,对不起,我误解了你的目标。我以为你想剪裁。 我愿意,但问题是我想要裁剪的可视化实时预览;) - 我已经想通了,一旦准备好我会发布我的解决方案。 :) 杰夫,你有没有发布过你的解决方案,我正在寻找同样的东西。 @Jeff,这个问题的解决方案是如何出现的...同样的问题以上是关于MonoTouch,在 UIImageView 上绘制裁剪区域层的主要内容,如果未能解决你的问题,请参考以下文章
MonoTouch:添加 UIImageView 后 UITableViewCell 更改高度
如何在 DialogViewController (Monotouch.Dialog) 上设置背景颜色