2015-11-05 3 views
0

У меня есть 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]); 

} 
+0

Попытайтесь использовать floor() в своих расчетах, чтобы избежать частичного выравнивания пикселей, особенно для начала координат. – Avi

+0

No floor() удаляет десятичные точки и имеет больше ошибок в обрезанной области. – batuman

ответ

1

Вы уверены, что вам нужно два отношения? Если вы хотите, чтобы ваш образ имел правильные пропорции, вы должны использовать только одно соотношение.

Если вам нужно заполнить прямоугольник (даже если UIImageView делает это для вас), тогда сначала вычислите отношение по оси x. Вычислите масштабированную высоту с помощью этого отношения, если оно меньше высоты, которую вам нужно покрыть, затем вычислите отношение по оси y.

Наконец, только что вычисленное соотношение используется для масштабирования изображения.

+0

Да, ты хороший. Для ширины и высоты не требуется два отношения. Но для позиций x и y мне все еще нужны два отношения. Это умножение позиции x, y имеет некоторое смещение позиции. – batuman

+0

yep - это правильно. Но тогда у вашего изображения ожидаемый размер и соотношение, нет? Кстати, я предпочел бы использовать центр изображения как ссылку, чем левый верхний угол. Если вы используете разные соотношения для масштабирования своего смещения и ваших измерений, я не уверен, что он может работать. – Moose

+0

Да, спасибо, центр - это вид верхнего левого угла, добавленного с фиксированным интервалом. Я думаю, что все будет так. Потому что мой прямоугольник квадратный. – batuman

Смежные вопросы