![](/img/trans.png)
[英]Trying to crop my UIImage to a 1:1 aspect ratio (square) but it keeps enlarging the image causing it to be blurry. Why?
[英]Making square crop of UIImage causing image to stretch
嘗試執行UIImage的中心裁剪時,我得到以下結果(左為640*1136
的原始圖像,右為擬合為320*320
的方形UIImageView
的裁剪圖像):
變成:
我對比率元素進行了很多修改,以便它可以正確檢測要修剪的量:使用圖像的較短邊,基於short_side/width_of_desired_rect
構造一個比率,但是在這種情況下它似乎不起作用。 幫助贊賞!
- (UIImage *)squareImageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
double ratio;
double delta;
CGPoint offset;
//make a new square size, that is the resized imaged width
CGSize sz = CGSizeMake(newSize.width, newSize.width);
//figure out if the picture is landscape or portrait, then
//calculate scale factor and offset
if (image.size.width > image.size.height) {
ratio = newSize.width / image.size.width;
delta = (ratio*image.size.width - ratio*image.size.height);
offset = CGPointMake(delta/2, 0);
} else {
ratio = newSize.width / image.size.height;
delta = (ratio*image.size.height - ratio*image.size.width);
offset = CGPointMake(0, delta/2);
}
//make the final clipping rect based on the calculated values
CGRect clipRect = CGRectMake(-offset.x, -offset.y,
(ratio * image.size.width) + delta,
(ratio * image.size.height) + delta);
//for retina consideration
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(sz, YES, 0.0);
} else {
UIGraphicsBeginImageContext(sz);
}
UIRectClip(clipRect);
[image drawInRect:clipRect];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
嘗試這個:
- (UIImage *)squareImageFromImage:(UIImage *)image scaledToSize:(CGFloat)newSize {
CGAffineTransform scaleTransform;
CGPoint origin;
if (image.size.width > image.size.height) {
CGFloat scaleRatio = newSize / image.size.height;
scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio);
origin = CGPointMake(-(image.size.width - image.size.height) / 2.0f, 0);
} else {
CGFloat scaleRatio = newSize / image.size.width;
scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio);
origin = CGPointMake(0, -(image.size.height - image.size.width) / 2.0f);
}
CGSize size = CGSizeMake(newSize, newSize);
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(size, YES, 0);
} else {
UIGraphicsBeginImageContext(size);
}
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextConcatCTM(context, scaleTransform);
[image drawAtPoint:origin];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
Swift3版本的fumoboy007的代碼。
func squareImage(img: UIImage, scaledToSize newSize: CGFloat) -> UIImage {
var scaleTransform: CGAffineTransform
var origin: CGPoint
var image = img
if image.size.width > image.size.height {
let scaleRatio: CGFloat = newSize / image.size.height
scaleTransform = CGAffineTransform(scaleX: scaleRatio, y: scaleRatio)
origin = CGPoint(x: -(image.size.width - image.size.height) / 2.0, y: 0)
}
else {
let scaleRatio: CGFloat = newSize / image.size.width
scaleTransform = CGAffineTransform(scaleX: scaleRatio, y: scaleRatio)
origin = CGPoint(x: 0, y: -(image.size.height - image.size.width) / 2.0)
}
let size = CGSize(width: newSize, height: newSize)
if image.size.width > image.size.height {
UIGraphicsBeginImageContextWithOptions(size, true, 0)
}
else {
UIGraphicsBeginImageContext(size)
}
let context: CGContext? = UIGraphicsGetCurrentContext()
context?.concatenate(scaleTransform)
image.draw(at: origin)
image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
使用此代碼調整圖像大小
// Returns image resized to the desired CGSize
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
編輯:您基本上也在這里重畫。 如果您要一遍又一遍地重復使用同一張圖片,則最好一次調用一次並將結果保存為文件。 在以后的調用中加載該文件,而不是原始文件。
編輯2:好的,所以您要做的是保持寬高比,同時將圖像調整為正方形。 上面的代碼通過調整大小基本上將圖像調整為正方形,但它沒有保持寬高比。 保持縱橫比的一種方法是找到縮小圖像兩個維度中較大的一個,然后將另一個維度縮小相同的因子。 讓我知道您是否遇到麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.