Я отрезные UIImages с UIBezierPath использованием UIGraphicsContext (пиксельных форматов, кодеков?):UIImage Искажение из UIGraphicsBeginImageContext с большими файлами
CGSize thumbnailSize = CGSizeMake(54.0f, 45.0f); // dimensions of UIBezierPath
UIGraphicsBeginImageContextWithOptions(thumbnailSize, NO, 0);
[path addClip];
[originalImage drawInRect:CGRectMake(0, originalImage.size.height/-3, thumbnailSize.width, originalImage.size.height)];
UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Но по какой-то причине мои изображения становятся растянутой по вертикали (все выглядит немного долго и тощий), и этот эффект сильнее, чем больше мой originalImage
. Я уверен, что оригинальные изображения отлично подходят, прежде чем я сделаю эти операции (я проверил)
Мои изображения - все 9:16 (скажем, 72px wide to 128px tall), если это имеет значение.
Я видел, что UIGraphics создает растровое изображение с «32-битным целочисленным размером ARGB-формата с использованием байтового байта»; и я признаю немного невежества, когда речь идет о форматах пикселей, но почувствовала, что это МОЖЕТ быть актуальным, потому что я не уверен, что это тот же формат пикселей, который я использую для кодирования данных изображения.
Не знаю, какое отношение это, но вот полный конвейер обработки: Я захватывая с помощью AVFoundation и я поставил мои photoSettings, как
NSDictionary *photoSettings = @{AVVideoCodecKey : AVVideoCodecH264};
захватывая с помощью captureStillImageAsynchronouslyFromConnection:..
затем превратить его в NSData используя [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
то сокращение в миниатюру, создав CGDataProviderRefWithCFData
и преобразовывая в CGImageRef
с помощью CGImageSourceCreateThumbnailAtIndex
и получая UIImage от этого.
Позже я еще раз включил его в NSData, используя UIImageJPEGRepresentation(thumbnail, 0.7)
, поэтому я могу хранить. И, наконец, когда я готов к отображению, я вызываю свой собственный метод подробно сверху [self maskImage:[UIImage imageWithData:imageData] toPath:_thumbnailPath]
и отображает его на UIImageView и устанавливает contentMode = UIViewContentModeScaleAspectFit
.
Если метод я использую, чтобы замаскировать UIImage с UIBezierPath отлично, я может в конечном итоге явного задания параметров photoOutput с [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey, nil]
и я, вероятно, может использовать что-то вроде how to convert a CVImageBufferRef to UIImage и многое изменить мой код .. но я действительно не делаю этого, если не будет абсолютно необходимо, поскольку, как я уже упоминал, я действительно мало знаю о кодировании видео/всех этих графических объектах низкого уровня.
* facepalm * .... Только что получил дело с другой проблемой искажения (похоже на: http://stackoverflow.com/questions/9691646/why-does-my-movie-from-uiimages-gets-distorted ? rq = 1), поэтому, конечно, я убеждаю себя, что это ДОЛЖНО быть проблемой с моим конвейером обработки изображений ... – gadu
Такие вещи заставляют меня одновременно любить и ненавидеть программирование для (а) не так сложно, как я думал. но (б) слишком легко совершить неосторожную ошибку (например, вызвать неправильную переменную), которая все испортит – gadu