Как разрезать большой спрайт png на меньшие UIImages?
например, файл png составляет 1200 (h) x 50 (w) пикселей, как я могу вырезать png и нагрузки в 6 UIImage
s, каждые 200 (h) x 50 (w). Спасибо!
EDIT-благодаря ответу Михала, окончательный код:
CGImageRef imageToSplit = [UIImage imageNamed:@"huge.png"].CGImage;
CGImageRef partOfImageAsCG = CGImageCreateWithImageInRect(imageToSplit, CGRectMake(0, 0, 50, 50));
UIImage *partOfImage = [UIImage imageWithCGImage:partOfImageAsCG];
// ...
CGImageRelease(partOfImageAsCG);
2 ответов
посмотрите на функцию CGImageCreateWithImageInRect. Он работает с CGImage, но его легко конвертировать между этим и UIImage.
вот пример (набранный из памяти, может не компилироваться):
CGImageRef imageToSplit = [UIImage imageNamed:@"huge.png"].CGImage;
CGImageRef partOfImageAsCG = CGImageCreateWithImageInRect(imageToSplit, CGRectMake(0, 0, 200, 50));
CGRelease(imageToSplit);
UIImage *partOfImage = [UIImage imageWithCGImage:partOfImageAsCG];
CGImageRelease(partOfImageAsCG);
метод многоразовый:
-(UIImage*)ExtractImageOn:(CGPoint)pointExtractedImg ofSize:(CGSize)sizeExtractedImg FromSpriteSheet:(UIImage*)imgSpriteSheet
{
UIImage *ExtractedImage;
CGRect rectExtractedImage;
rectExtractedImage=CGRectMake(pointExtractedImg.x,pointExtractedImg.y,sizeExtractedImg.width,sizeExtractedImg.height);
CGImageRef imgRefSpriteSheet=imgSpriteSheet.CGImage;
CGImageRef imgRefExtracted=CGImageCreateWithImageInRect(imgRefSpriteSheet,rectExtractedImage);
ExtractedImage=[UIImage imageWithCGImage:imgRefExtracted];
CGImageRelease(imgRefExtracted);
//CGImageRelease(imgRefSpriteSheet); I have commented it because
// we should not release the object that we don't own.
// So why do we release imgRefExtracted alone? because it has
// name create in its method so the ownership comes to us so we
// have to release it.
return ExtractedImage;
}
FYI:
несмотря на то, что на него был дан четкий ответ, я думал, что предоставление его как простого многоразового фрагмента кода "Copy-Paste" будет большой помощью программистам, и я приписываю ответ Михаль