Исходное изображение: Отфильтрованное изображение:
Я пытаюсь обрезать UIImages (фотографии в фотопленке телефона) на квадраты. Вот часть кода, который я использую, где «изображение» - это изображение, которое обрезается:
if( image.size.height > image.size.width )
{
dimension = image.size.width;
imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake((image.size.height-dimension)/2, 0, dimension, dimension));
Если я использую исходное изображение, оно выглядит следующим образом:
Это нормально и чего я ожидаю - у меня есть алгоритм вращения, который здесь не показан.
Если я использую отфильтрованное изображение, оно выглядит так:
... не квадратная обрезка, а странное увеличение. Кажется, в этом и заключается проблема, и я не знаю, почему эти отфильтрованные изображения ведут себя по-другому.
}
else
{
dimension = image.size.height;
imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake((image.size.width-dimension)/2, 0, dimension, dimension));
}
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
CGContextRef bitmap;
bitmap = CGBitmapContextCreate(NULL, dimension, dimension, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
Моя проблема в том, что в последней строке CGBitmapContextCreate я иногда получаю следующую ошибку:
<Error>: CGBitmapContextCreate: invalid data bytes/row: should be at least 7744 for 8 integer bits/component, 3 components, kCGImageAlphaNoneSkipLast.
Странно то, что обычно этого не происходит - до сих пор я сталкивался с этой ошибкой только тогда, когда исходное изображение имеет высоту больше ширины, и оно было отфильтровано другим приложением под названием Camera +. ... та же самая фотография до фильтрации не вызывает проблем, и фильтрованная фотография пейзажа тоже кажется хорошей.
Может ли кто-нибудь направить меня сюда или помочь объяснить, что на самом деле происходит? Я достаточно понимаю из сообщения об ошибке, чтобы знать, что если я заменю CGImageGetBytesPerRow (imageRef) на произвольное число выше 7744, ошибка больше не возникает, но я недостаточно разбираюсь в этом материале CGImage, чтобы знать, какое влияние это на самом деле оказывает на что-либо, и мне это не кажется реальным решением. Этот код основан на других примерах обрезки, которые я видел в Интернете, поэтому мое понимание этих растровых функций ограничено.
Любые мысли были бы очень признательны!
ИЗМЕНИТЬ
Я нашел этот вопрос на SO: Почему в этом CGBitmapContextCreate bytesPerRow 0? и мне было предложено попробовать установить для параметра bytesPerRow значение 0. Оказывается, это устраняет ошибку, но моя процедура обрезки не работает должным образом в тех же ситуациях, когда эта ошибка возникала раньше. Для ответа на этот вопрос может потребоваться специальный человек, но разве кто-нибудь знает достаточно о фильтрации изображений, чтобы догадаться, почему портретно-ориентированные фотографии с фильтром камеры и камеры каким-либо образом обрабатываются этим кодом по-другому? Я обновил заголовок, так как вопрос немного изменился.
РЕДАКТИРОВАТЬ2
Я добавил примеры изображений в приведенный выше код, и, в конце концов, после любого необходимого поворота окончательные кадрированные изображения выглядят следующим образом:
с исходным изображением: - отлично!
с отфильтрованным изображением: - ужасно!
Код, который использовался для создания этих окончательных, предположительно обрезанных изображений, таков:
CGContextDrawImage(bitmap, CGRectMake(0, 0, dimension, dimension), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
image = [UIImage imageWithCGImage:ref];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);