iOS: неверный результат с CGBitmapContextCreate при вызове метода
Я почесал голову над этим часами.
Я использую следующий метод, чтобы изменить размер 2 изображения. Один за другим:
CGImageRef imageReference = [image CGImage];
bytes = malloc(width * height * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(bytes, width, height, bitsPerComponent,
bytesPerRow, colorSpaceReference,
kCGImageAlphaPremultipliedLast);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageReference);
CGImageRelease(imageReference);
CGContextRelease(context);
Работает нормально, без проблем - только одно изображение. Если я вызову этот метод снова, например:
[self resizeImageWithSize:imageSize]; //this is OK.
[self resizeImageWithSize:imageSize]; //this would not come out right
где размер изображения определяется: image1.size
а также image2.size
, Я попытался перевернуть вызывающую последовательность методов, первый всегда корректен.
Они не слишком большие, 400 х 300, 300 х 360. И я просто хотел бы изменить размер одного до 200 х 200, а другой, например, 150 х 150. И это просто png.
Это работает, но если я вызову этот метод снова, второе изображение будет неправильным. Неправильно, что это испортило пиксели как пятна воды на бумаге. Иногда это даже становится неузнаваемым.
Я что-то здесь упускаю? Я пытался free(bytes);
что я не думаю, что здесь нужно, но ради попыток, но все же это ничего не приносит. Правильно ли я освобождаю / освобождаю что-то, чтобы во второй раз при вызове метода старые байтовые данные сохранялись? Я просто догадываюсь здесь. Использую ARC.
1 ответ
Я использую этот метод, и он работает как шарм, надеюсь, это поможет:
- (UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)newSize
{
UIImage *newImage = nil;
UIGraphicsBeginImageContextWithOptions(newSize, YES, 0.0);
[image drawInRect:CGRectMake(0.0,
0.0,
newSize.width,
newSize.height)];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}