我正在使用下面的代码绘制一个 UIImage。我正在使用一些顶点来绘制,在本例中是一个正方形:
- (UIImage *)drawTexture : (NSArray *)verticesPassed {
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef con = CGBitmapContextCreate(NULL,
1000,
1000,
8,
0,
rgbColorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(rgbColorSpace);
CGContextSetLineWidth(con, 10);
Line * start = [verticesPassed objectAtIndex:0];
StandPoint * startPoint = start.origin;
CGContextMoveToPoint(con, [startPoint.x floatValue], [startPoint.y floatValue]);
for (Line * vertice in verticesPassed) {
StandPoint * origin = vertice.origin;
CGContextAddLineToPoint(con, [origin.x floatValue], [origin.y floatValue]);
NSLog(@"Texutre point is %f %f", [origin.x floatValue], [origin.y floatValue]);
}
CGContextSetFillColorWithColor(con, [UIColor greenColor].CGColor);
CGContextFillPath(con);
[self drawText:con startX:250 startY:200 withText:standName];
[self drawText:con startX:250 startY:150 withText:standNumber];
CGImageRef cgImage = CGBitmapContextCreateImage(con);
UIImage *newImage = [[UIImage alloc]initWithCGImage:cgImage];
NSLog(@"Size is %f", newImage.size.height);
return newImage;
}
我的正方形的顶点是:
Texutre point is 667.000000 379.000000
Texutre point is 731.000000 379.000000
Texutre point is 731.000000 424.000000
Texutre point is 667.000000 424.000000
问题是在 1000x1000 的上下文中,这显然在上下文的右上角绘制了一个非常小的形状。
因为我想使用这个 UIImage 作为纹理,我的问题是如何创建一个没有任何空格的正确大小的形状(即它从 0,0 开始)?
来自 Bugivore 的代码:
- (UIImage *)drawTexture : (NSArray *)verticesPassed {
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
//This function gets the bounds or smallest rectangle required to generate a shape which
//will be used as pattern
CGRect shp = [self boundFromFrame:verticesPassed];
//Generate the shape as image so that we can make pattern out of it.
CGContextRef conPattern = CGBitmapContextCreate(NULL,
shp.size.width,
shp.size.height,
8,
0,
rgbColorSpace,
(CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(rgbColorSpace);
CGContextSetLineWidth(conPattern, 10);
CGContextSetStrokeColorWithColor(conPattern, [UIColor blueColor].CGColor);
Line * start = [verticesPassed objectAtIndex:0];
StandPoint * startPoint = start.origin;
CGContextMoveToPoint(conPattern, [startPoint.x floatValue]-shp.origin.x , [startPoint.y floatValue]-shp.origin.y);
for (Line * vertice in verticesPassed) {
StandPoint * standPoint = vertice.origin;
CGContextAddLineToPoint(conPattern, [standPoint.x floatValue]-shp.origin.x, [standPoint.y floatValue]-shp.origin.y);
}
CGContextStrokePath(conPattern);
//Make the main image and color it with pattern.
CGImageRef cgImage = CGBitmapContextCreateImage(conPattern);
UIImage *imgPattern = [[UIImage alloc]initWithCGImage:cgImage];
//UIImageWriteToSavedPhotosAlbum(imgPattern, nil, nil, nil);
UIColor *patternColor = [UIColor colorWithPatternImage:imgPattern];
CGContextRef con = CGBitmapContextCreate(NULL,
500,
500,
8,
0,
rgbColorSpace,
(CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(rgbColorSpace);
CGContextSetLineWidth(con, 10);
CGContextMoveToPoint(con, 0 , 0);
CGContextAddLineToPoint(con, 500 , 0 );
CGContextAddLineToPoint(con, 500, 500 );
CGContextAddLineToPoint(con, 0 , 500);
CGContextSetFillColorWithColor(con, patternColor.CGColor);
CGContextFillPath(con);
CGImageRef cgImageFinal = CGBitmapContextCreateImage(con);
UIImage *newImage = [[UIImage alloc]initWithCGImage:cgImageFinal];
UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil);
return newImage;
}
-(CGRect)boundFromFrame:(NSArray*)verticesPassed
{
float top,left,right,bottom;
bool bFirst = YES;
for (Line * vertice in verticesPassed) {
StandPoint * standPoint = vertice.origin;
if(bFirst)
{
left = right = [standPoint.x floatValue];
top = bottom = [standPoint.y floatValue];
bFirst = NO;
}
else{
if ([standPoint.x floatValue]<left) left = [standPoint.x floatValue];
if ([standPoint.x floatValue]>right) right = [standPoint.x floatValue];
if ([standPoint.x floatValue]<top) top = [standPoint.y floatValue];
if ([standPoint.x floatValue]>bottom) bottom = [standPoint.y floatValue];
}
}
return CGRectMake(left, top, right - left, bottom-top);
}
在相册中:
最佳答案
请注意,我已经稍微修改了您的代码以对其进行测试。但这需要数组坐标并根据线坐标绘制形状。使用该形状在 1000x1000 图像上绘制图案。最终图像保存在您的相册中,以便您可以测试代码。您可以根据原始代码将其替换为 UIImage 的返回。然而,这主要向您展示了如何使用绘图创建纹理的技术。
- (void)drawTexture : (NSArray *)verticesPassed {
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
//This function gets the bounds or smallest rectangle required to generate a shape which
//will be used as pattern
CGRect shp = [self boundFromFrame:verticesPassed];
//Generate the shape as image so that we can make pattern out of it.
CGContextRef conPattern = CGBitmapContextCreate(NULL,
shp.size.width,
shp.size.height,
8,
0,
rgbColorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(rgbColorSpace);
CGContextSetLineWidth(conPattern, 10);
CGContextSetStrokeColorWithColor(conPattern, [UIColor blueColor].CGColor);
Line * start = [verticesPassed objectAtIndex:0];
CGContextMoveToPoint(conPattern, start.x-shp.origin.x , start.y-shp.origin.y);
for (Line * vertice in verticesPassed) {
CGContextAddLineToPoint(conPattern, vertice.x-shp.origin.x , vertice.y-shp.origin.y );
}
CGContextStrokePath(conPattern);
//Make the main image and color it with pattern.
CGImageRef cgImage = CGBitmapContextCreateImage(conPattern);
UIImage *imgPattern = [[UIImage alloc]initWithCGImage:cgImage];
//UIImageWriteToSavedPhotosAlbum(imgPattern, nil, nil, nil);
UIColor *patternColor = [UIColor colorWithPatternImage:imgPattern];
CGContextRef con = CGBitmapContextCreate(NULL,
1000,
1000,
8,
0,
rgbColorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(rgbColorSpace);
CGContextSetLineWidth(con, 10);
CGContextMoveToPoint(con, 0 , 0);
CGContextAddLineToPoint(con, 1000 , 0 );
CGContextAddLineToPoint(con, 1000 , 1000 );
CGContextAddLineToPoint(con, 0 , 10000 );
CGContextSetFillColorWithColor(con, patternColor.CGColor);
CGContextFillPath(con);
CGImageRef cgImageFinal = CGBitmapContextCreateImage(con);
UIImage *newImage = [[UIImage alloc]initWithCGImage:cgImageFinal];
UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil);
}
-(CGRect)boundFromFrame:(NSArray*)verticesPassed
{
float top,left,right,bottom;
bool bFirst = YES;
for (Line * vertice in verticesPassed) {
if(bFirst)
{
left = right = vertice.x;
top = bottom = vertice.y;
bFirst = NO;
}
else{
if (vertice.x<left) left = vertice.x;
if (vertice.x>right) right = vertice.x;
if (vertice.x<top) top = vertice.y;
if (vertice.x>bottom) bottom = vertice.y;
}
}
return CGRectMake(left, top, right - left, bottom-top);
}
关于ios - 使用 CGBitmapContextCreate 绘制 UIImage - 纹理的全尺寸图像 - iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20371338/