UIImage, созданный из CGImageRef, перестал работать с UIImagePNGRepresentation

Я использую следующий код, чтобы обрезать и создать новый UIImage из большего. Я изолировал проблему, чтобы быть с функциональным CGImageCreateWithImageInRect (), которые, кажется, не устанавливают некоторое свойство CGImage путем, я хочу.:-), проблема состоит в том что вызов для функционирования UIImagePNGRepresentation () сбои, возвращая ноль.

CGImageRef origRef = [stillView.image CGImage];
CGImageRef cgCrop = CGImageCreateWithImageInRect( origRef, theRect);
UIImage *imgCrop = [UIImage imageWithCGImage:cgCrop];

...

NSData *data = UIImagePNGRepresentation ( imgCrop);

- ошибка libpng: Никакой IDATs не записан в файл

Какая-либо идея, что могло бы неправильно или альтернатива для обрезки реагирования из UIImage? Большое спасибо!

13
задан gerry3 10 February 2010 в 21:38
поделиться

2 ответа

В PNG присутствуют различные чанки, некоторые содержат информацию о палитре, некоторые - фактические данные изображения и некоторую другую информацию, это очень интересный стандарт. Чанк IDAT - это бит, который фактически содержит данные изображения. Если нет "IDAT записан в файл", значит, у libpng возникли проблемы с созданием PNG из входных данных.

Я не знаю, что именно представляет собой ваш stillView.image, но что происходит, когда вы передаете своему коду CGImageRef, который, безусловно, является действительным? Каковы фактические значения в theRect? Если ваш theRect выходит за границы изображения, то cgCrop, который вы пытаетесь использовать для создания UIImage, легко может быть нулевым - или не нулевым, но не содержать изображения или содержать изображение с шириной и высотой 0, не давая libpng ничего для работы.

1
ответ дан 2 December 2019 в 02:05
поделиться

Кажется, душа, которую вы пытаетесь использовать, должна сработать, но я рекомендую использовать это:

CGImageRef image = [stillView.image CGImage];
CGRect cropZone;

size_t cWitdh = cropZone.size.width;
size_t cHeight = cropZone.size.height;
size_t bitsPerComponent = CGImageGetBitsPerComponent(image);
size_t bytesPerRow = CGImageGetBytesPerRow(image) / CGImageGetWidth(image) * cWidth;

//Now we build a Context with those dimensions.
CGContextRef context = CGBitmapContextCreate(nil, cWitdh, cHeight, bitsPerComponent, bytesPerRow, CGColorSpaceCreateDeviceRGB(), CGImageGetBitmapInfo(image));

CGContextDrawImage(context, cropZone, image);

CGImageRef result  = CGBitmapContextCreateImage(context);
UIImage * cropUIImage = [[UIImage alloc] initWithCGImage:tmp];

CGContextRelease(context);
CGImageRelease(mergeResult);
NSData * imgData = UIImagePNGRepresentation ( cropUIImage);

Надеюсь, это поможет.

1
ответ дан 2 December 2019 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: