2013-03-22 26 views
2

我需要一些使用CGContextDrawImage的帮助。我有以下代码将创建一个位图上下文并将像素数据转换为CGImageRef。现在我需要使用CGContextDrawImage显示该图像。我不清楚我应该如何使用它。以下是我的代码:如何使用CGContextDrawImage?

- (void)drawBufferWidth:(int)width height:(int)height pixels:(unsigned char*)pixels 
    { 
    const int area = width *height; 
    const int componentsPerPixel = 4; 
    unsigned char pixelData[area * componentsPerPixel]; 

    for(int i = 0; i<area; i++) 
    { 
      const int offset = i * componentsPerPixel; 
      pixelData[offset] = pixels[0]; 
      pixelData[offset+1] = pixels[1]; 
      pixelData[offset+2] = pixels[2]; 
      pixelData[offset+3] = pixels[3]; 
    } 

    const size_t BitsPerComponent = 8; 
    const size_t BytesPerRow=((BitsPerComponent * width)/8) * componentsPerPixel; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef gtx = CGBitmapContextCreate(pixelData, width, height, BitsPerComponent, BytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); 
    CGImageRef myimage = CGBitmapContextCreateImage(gtx); 

    //What code should go here to display the image? 

    CGContextRelease(gtx); 
    CGImageRelease(myimage); 

} 

任何帮助或示例代码将很好。提前致谢!

回答

1

创建一个文件名为:MyDrawingView.h

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 

@interface MyDrawingView : UIView 
{ 
} 

@end 

现在创建一个文件名为:MyDrawingView.m

#import "MyChartView.h" 

@implementation MyDrawingView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 

     // Write your initialization code if any. 

    } 
    return self; 
} 

// Only override drawRect: if you perform custom drawing. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 

    // Create Current Context To Draw 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    UIImage *image = [UIImage imageNamed:@"image.jpg"]; 
    // Draws your image at given poing 
    [image drawAtPoint:CGPointMake(10, 10)]; 
} 

//现在使用它在你看来

#import "MyChartView.h"  

MyDrawingView *drawView = [[MyDrawingView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
[self.view addSubview:drawView]; 


// whenever you want to update that view call 
[drawView setNeedsDisplay]; 

//您的处理方法(绘制)

- (void)drawBufferWidth:(int)width height:(int)height pixels:(unsigned char*)pixels 
{ 
    const int area = width *height; 
    const int componentsPerPixel = 4; 
    unsigned char pixelData[area * componentsPerPixel]; 

    for(int i = 0; i<area; i++) 
    { 
     const int offset = i * componentsPerPixel; 
     pixelData[offset] = pixels[0]; 
     pixelData[offset+1] = pixels[1]; 
     pixelData[offset+2] = pixels[2]; 
     pixelData[offset+3] = pixels[3]; 
    } 

    const size_t BitsPerComponent = 8; 
    const size_t BytesPerRow=((BitsPerComponent * width)/8) * componentsPerPixel; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef gtx = CGBitmapContextCreate(pixelData, width, height, BitsPerComponent, BytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); 
    CGImageRef myimage = CGBitmapContextCreateImage(gtx); 

    // Convert to UIImage 
    UIImage *image = [UIImage imageWithCGImage:myimage]; 

    // Create a rect to display 
    CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); 

    // Here is the Two Snnipets to draw image 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Transform image 
    CGContextTranslateCTM(context, 0, image.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // Finaly Draw your image 
    CGContextDrawImage(context, imageRect, image.CGImage); 

    // You can also use following to draw your image in 'drawRect' method 
    // [[UIImage imageWithCGImage:myimage] drawInRect:CGRectMake(0, 0, 145, 15)]; 

    CGContextRelease(gtx); 
    CGImageRelease(myimage); 
} 
+0

非常感谢您的回复!我尝试了代码,没有任何显示。也许我错过了一些东西。我需要指定视图还是什么? – Ereka 2013-03-22 06:45:07

+0

创建一个自定义类(UIView的子视图)以编程方式将它添加到您的视图中,然后在您的自定义类中覆盖“ - (void)drawRect:(CGRect)矩形”方法。并写这个代码在那里,试试这个.. – 2013-03-22 09:28:57

+0

如果我只是调用图像的drawInRect方法就够了吗?我不必重写drawRect,因为我只是在图像上显示和不做任何修改。 – Ereka 2013-03-25 04:45:01

1

如果有其他人处理此问题,请尝试将以下代码插入Ereka的代码中。迪彭的解决方案似乎有点太过分了。在评论“//什么代码应该去这里显示图像”之后,请输入以下代码:

CGRect myContextRect = CGRectMake (0, 0, width, height); 
CGContextDrawImage (gtx, myContextRect, myimage); 
CGImageRef imageRef = CGBitmapContextCreateImage(gtx); 
UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
UIImageView *imgView = [[UIImageView alloc] initWithImage:finalImage]; 
[self.view addSubview:imgView]; 
相关问题