2013-03-22 2 views
2

Мне нужна помощь с помощью CGContextDrawImage. У меня есть следующий код, который создаст контекст Bitmap и преобразует пиксельные данные в 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]; 

// его метод обрабатывать (рисовать) image

- (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

+0

создать собственный класс (subview of UIView) добавить его в ваш просмотр программно, а затем в вашем настраиваемом классе переопределить метод "- (void) drawRect: (CGRect) rect". и напишите этот код там, попробуйте это. –

+0

Если я просто вызвал метод drawInRect с изображением, то достаточно правильно? Мне не нужно переопределять drawRect, так как я только показываю и не делаю никаких изменений на изображении. – Ereka

1

Если есть кто-то другой, занимающийся этой проблемой, попробуйте вставить следующий код в код Эреки. Решение Dipen кажется слишком большим. Сразу после комментария «// Какой код должен быть здесь, чтобы отобразить изображение», введите следующий код:

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]; 
Смежные вопросы