У меня есть UIImageView
с размером (0,0,414,471). Изображение с размером (0,0,1236,1242) отображается с UIViewContentModeScaleAspectFit
в режиме UIImageView
. Таким образом, изображение красиво отображается. Затем я рисую прямоугольник (0,0,100,100) на изображении, и мне нравится его обрезать. Несмотря на то, что прямоугольник, покрытый (100,100) на UIImageView
, при фактическом размере изображения (100 100) не охватывает размер, как показано на UIImageView
. Поэтому я делаю xratio (фактическая ширина/ширина экрана) и yratio (фактическая высота/высота дисплея), затем я умножаю размер прямоугольника на все x, y, ширину и высоту прямоугольника. Этот подход выглядит так, что я могу обрезать область как можно ближе, как показано на рисунке UIImageView
. Но все же есть немного смещения области и искажения. Каким может быть лучший способ обрезать в этом сценарии? Мой код показан нижеИзображение обрезки из UIImageView
- (void)saveCroppedImage:(UIImage *)image withcroppedRectangle:(CGRect)clippedRect
{
float xratio = image.size.width/displayWidth;
float yratio = image.size.height/displayHeight;
// Crop logic
clippedRect.origin.x *= xratio;
clippedRect.origin.y *= yratio;
clippedRect.size.width *= xratio;
clippedRect.size.height *= yratio;
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], clippedRect);
UIImage * croppedImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
NSString *imageName [email protected]"Documents/";
imageName = [imageName stringByAppendingString:[CurrentToddlerProfile getUserID]];
imageName = [imageName stringByAppendingString:@".png"];
NSString *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:imageName];
// Write image to PNG
[UIImagePNGRepresentation(croppedImage) writeToFile:pngPath atomically:YES];
// Create file manager
// NSFileManager *fileMgr = [NSFileManager defaultManager];
// NSError *error;
// // Point to Document directory
// NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
// // Write out the contents of home directory to console
// NSLog(@"Documents directory: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]);
}
Попытайтесь использовать floor() в своих расчетах, чтобы избежать частичного выравнивания пикселей, особенно для начала координат. – Avi
No floor() удаляет десятичные точки и имеет больше ошибок в обрезанной области. – batuman