Как правильно обрезать UIImage, взятый с UIImagePickerController?
Это наложение камеры для моего приложения,
Желтый квадрат указывает пользователю, что будет сохранена только фотография внутри этой части (в камере). Это как урожай.
Когда я сохраню это захваченное изображение, оно сохранит увеличенное фото [большое увеличенное изображение],
Что я обнаружил, так это то, что когда я сделал фото, оно будет размером {2448, 3264}
Я обрезаю изображение вот так,
- (UIImage *)imageByCroppingImage:(UIImage *)image toSize:(CGSize)size
{
double x = (image.size.width - size.width) / 2.0;
double y = (image.size.height - size.height) / 2.0;
CGRect cropRect = CGRectMake(x, y, size.height, size.width);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);
UIImage *cropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return cropped;
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
if (image) {
UIImage *newImage = [self imageByCroppingImage:image toSize:CGSizeMake(300.f, 300.f)];
UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil);
}
}
Заметки,
Ориентация была исправлена до выполнения обрезки. Используя это, http://pastebin.com/WYUkDLS0
Этот желтый квадрат на камере также имеет такой же размер: ширина =300 и высота =300.
Если я установлю фронтальную камеру для
UIImagePickerController
тогда это даст мне идеальный вывод обрезанного изображения. Да, это действительно странно!Я пробовал все отсюда, обрезая UIImage. Даже https://github.com/Nyx0uf/NYXImagesKit не поможет.
Любая идея / предложения?
Обновить:
Из этого вопроса я пытаюсь обрезать мой UIImage с соотношением сторон 1:1 (квадрат), но он продолжает увеличивать изображение, делая его размытым. Зачем?
Я следовал за ответом @DrummerB, как это,
CGFloat originalWidth = image.size.width * image.scale;
CGFloat originalHeight = image.size.height * image.scale;
float smallestDimension = fminf(originalWidth, originalHeight);
CGRect square = CGRectMake(0, 0, smallestDimension, smallestDimension);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], square);
UIImage *squareImage = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation];
UIImageWriteToSavedPhotosAlbum(squareImage, nil, nil, nil);
CGImageRelease(imageRef);
Это то, что я запечатлел,
И это приводит меня к следующему,
Теперь я получаю квадратное фото, но обратите внимание на вывод, но я получаю фото за пределами этого желтого квадрата. Я хочу получить фотографию, которая находится в желтом квадрате. Захваченное изображение все еще имеет размер, {w=2448, h=3264}. Обратите внимание, что красные кружки обозначают внешнюю часть изображения, которая не должна включаться в вывод, поскольку эта часть не находится внутри желтого квадрата.
Что в этом плохого?
1 ответ
Похоже, что изображение, которое вы получаете в своей реализации, возвращает обрезку изображения размером 300 на 300 пикселей. Желтый квадрат у вас на экране 300 на 300 точек. Точки не совпадают с пикселями. Таким образом, если ваша фотография шириной 3264 пикселя, то ее обрезка до 300 пикселей приведет к получению изображения размером примерно в 1/10 от исходного размера.