title: Drawing UIImage using CGBitmapContextCreate - Full Size Image for Texture - iOS
body: <p>I am using the below code to draw a UIImage. I am using some vertices to draw, in this case, a square :</p>
  
  <pre><code>- (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;
  
  }
  </code></pre>
  
  <p>The vertices for my square are : </p>
  
  <pre><code>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
  </code></pre>
  
  <p>The problem is that in a 1000x1000 context this obviously draws a very small shape in the top right of the context.</p>
  
  <p>As I want to use this UIImage as a texture, my question is how can I create a shape of the correct size without any whitespace (i.e it starts at 0,0) ?</p>
  
  <p>Code from Bugivore :</p>
  
  <pre><code>- (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]&lt;left) left = [standPoint.x floatValue];
              if ([standPoint.x floatValue]&gt;right) right = [standPoint.x floatValue];
              if ([standPoint.x floatValue]&lt;top) top = [standPoint.y floatValue];
              if ([standPoint.x floatValue]&gt;bottom) bottom = [standPoint.y floatValue];
          }
  
      }
  
      return CGRectMake(left, top, right - left, bottom-top);
  
  }
  </code></pre>
  
  <p>In photo album :</p>
  
  <p><img src="https://i.stack.imgur.com/0d3ne.jpg" alt="enter image description here"></p>