從REST端點傳輸大圖像後,我需要將圖像分成多個較小的圖像切片。從較大的圖像創建一個子圖像
初始圖像是(例如)1024x1024,存儲在NSData中;我需要創建大小爲256x256的子圖像(在這種情況下,將會有16個子圖像)。
這將如何完成? (我還沒有發現任何文章,甚至接近,但我認爲這一定是可能的,因爲大多數圖像編輯軟件支持圖像裁剪。)
謝謝。
從REST端點傳輸大圖像後,我需要將圖像分成多個較小的圖像切片。從較大的圖像創建一個子圖像
初始圖像是(例如)1024x1024,存儲在NSData中;我需要創建大小爲256x256的子圖像(在這種情況下,將會有16個子圖像)。
這將如何完成? (我還沒有發現任何文章,甚至接近,但我認爲這一定是可能的,因爲大多數圖像編輯軟件支持圖像裁剪。)
謝謝。
@interface UIImage (Sprite)
- (NSArray *)spritesWithSpriteSheetImage:(UIImage *)image spriteSize:(CGSize)size;
- (NSArray *)spritesWithSpriteSheetImage:(UIImage *)image inRange:(NSRange)range spriteSize:(CGSize)size;
@end
@implementation UIImage (Sprite)
-(NSArray *)spritesWithSpriteSheetImage:(UIImage *)image spriteSize:(CGSize)size {
return [self spritesWithSpriteSheetImage:self inRange:NSMakeRange(0, lroundf(MAXFLOAT))
spriteSize:size];
}
-(NSArray *)spritesWithSpriteSheetImage:(UIImage *)image
inRange:(NSRange)range
spriteSize:(CGSize)size {
if (!image || CGSizeEqualToSize(size, CGSizeZero) || range.length == 0)
return nil;
NSLog(@"%i %i", range.location, range.length);
CGImageRef spriteSheet = [image CGImage];
NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];
int width = CGImageGetWidth(spriteSheet);
int height = CGImageGetHeight(spriteSheet);
int maxI = width/size.width;
int startI = 0;
int startJ = 0;
int length = 0;
int startPosition = range.location;
// Extracting initial I & J values from range info
//
if (startPosition != 0) {
for (int k=1; k<=maxI; k++) {
int d = k * maxI;
if (d/startPosition == 1) {
startI = maxI - (d % startPosition);
break;
}
else if (d/startPosition > 1) {
startI = startPosition;
break;
}
startJ++;
}
}
int positionX = startI * size.width;
int positionY = startJ * size.height;
BOOL isReady = NO;
while (positionY < height) {
while (positionX < width) {
CGImageRef sprite = CGImageCreateWithImageInRect(spriteSheet, CGRectMake(positionX, positionY, size.width, size.height));
[tempArray addObject:[UIImage imageWithCGImage:sprite]];
CGImageRelease(sprite);
length++;
if (length == range.length) {
isReady = YES;
break;
}
positionX += size.width;
}
if (isReady)
break;
positionX = 0;
positionY += size.height;
}
return [NSArray arrayWithArray:tempArray];
}
@end
這是我用來在我的一些項目中裁剪圖像的功能。
- (UIImage *)cropImage:(UIImage *) image{
CGRect rect = CGRectMake(0, 0, 256, 256);
CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, rect);
CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef));
UIGraphicsBeginImageContext(smallBounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, smallBounds, subImageRef);
UIImage* smallImg = [UIImage imageWithCGImage:subImageRef];
UIGraphicsEndImageContext();
return smallImg;
}
我認爲你可以從那裏罰款的方式多次調用它來裁剪你的圖片16次。
希望這有助於
我想你也需要手動釋放CGImageRef(因爲你創造了它自己):CGImageRelease(subImageRef); – StephenT
originalImageView是一個IBOutlet中ImageView的。該圖像將被裁剪。
#import <QuartzCore/QuartzCore.h>
這是爲了更好地理解每個切片周圍的邊界所需要的。
-(UIImage*)getCropImage:(CGRect)cropRect
{
CGImageRef image = CGImageCreateWithImageInRect([originalImageView.image CGImage],cropRect);
UIImage *cropedImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
return cropedImage;
}
-(void)prepareSlices:(uint)row:(uint)col
{
float flagX = originalImageView.image.size.width/originalImageView.frame.size.width;
float flagY = originalImageView.image.size.height/originalImageView.frame.size.height;
float _width = originalImageView.frame.size.width/col;
float _height = originalImageView.frame.size.height/row;
float _posX = 0.0;
float _posY = 0.0;
for (int i = 1; i <= row * col; i++) {
UIImageView *croppedImageVeiw = [[UIImageView alloc] initWithFrame:CGRectMake(_posX, _posY, _width, _height)];
UIImage *img = [self getCropImage:CGRectMake(_posX * flagX,_posY * flagY, _width * flagX, _height * flagY)];
croppedImageVeiw.image = img;
croppedImageVeiw.layer.borderColor = [[UIColor whiteColor] CGColor];
croppedImageVeiw.layer.borderWidth = 1.0f;
[self.view addSubview:croppedImageVeiw];
[croppedImageVeiw release];
_posX += _width;
if (i % col == 0) {
_posX = 0;
_posY += _height;
}
}
originalImageView.alpha = 0.0;
}
這樣稱呼它:
[self prepareSlices:16 :16];
我還沒有機會回到這個項目(並且可能不會花費大量時間),所以我沒有實現/測試答案。也就是說,我想給予信任,所以我將這個答案標記爲已接受。謝謝。 –