9

画像を複数の画像に分割する関数を作成しましたが、UIImage の CGImage を取得すると、CGImage は NULL を返します

NSArray* splitImage(UIImage* image,NSUInteger pieces) {

NSLog(@"width: %f, %zu",image.size.width,CGImageGetWidth(image.CGImage));
NSLog(@"%@",image.CGImage);
returns NULL
NSMutableArray* tempArray = [[NSMutableArray alloc]initWithCapacity:pieces];

CGFloat piecesSize = image.size.height/pieces;

for (NSUInteger i = 0; i < pieces; i++) {

    // take in account retina displays
    CGRect subFrame = CGRectMake(0,i * piecesSize * image.scale ,image.size.width * image.scale,piecesSize * image.scale);

    CGImageRef newImage = CGImageCreateWithImageInRect(image.CGImage,subFrame);

    UIImage* finalImage =[UIImage imageWithCGImage:newImage];

    CGImageRelease(newImage);

    [tempArray addObject:finalImage];

}

NSArray* finalArray = [NSArray arrayWithArray:tempArray];

[tempArray release];

return finalArray;



}
4

5 に答える 5

7

UIImage が IOSurface や CIImage などの別の画像から作成された場合、CGImage プロパティは nil を返します。この特定のケースでこれを回避するには、c 関数を使用して IOSurface から CGImage を作成し、それを UIImage に変換します。

UICreateCGImageFromIOSurface(IOSurfaceRef surface);
于 2012-04-05T20:22:08.203 に答える
3

ここで行ったことは、幅が0.fのピースを作成することです。ピースの&forを定義するには、2つのsを使用する必要があります。このようなコードサンプル(まだテストされていませんが、機能するはずです):widthheight

for (int height = 0; height < image.size.height; height += piecesSize) {
  for (int width = 0; width < image.size.width; width += piecesSize) {
    CGRect subFrame = CGRectMake(width, height, piecesSize, piecesSize);

    CGImageRef newImage = CGImageCreateWithImageInRect(image.CGImage, subFrame);
    UIImage * finalImage = [UIImage imageWithCGImage:newImage];
    CGImageRelease(newImage);

    [tempArray addObject:finalImage];
  }
}
于 2012-04-05T04:22:40.617 に答える
1

画像をトリミングしようとすると、場合によっては発生します。私はこのような解決策を見つけましたこれはあなたを助けることができるかもしれません:-

NSData *imageData = UIImageJPEGRepresentation(yourImage, 0.9);
newImage = [UIImage imageWithData:imageData];
于 2012-04-05T06:17:14.640 に答える