3

我正在使用下面的代码来绘制 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);

}

在相册中:

在此处输入图像描述

4

1 回答 1

1

请注意,我对您的代码进行了一些修改以对其进行测试。但这需要数组坐标并根据线坐标绘制形状。使用该形状在 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);

}
于 2013-12-04T12:03:30.497 回答