注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

又一个部落格

换过很多备忘录,不知道这本怎么样!

 
 
 

日志

 
 

Bitmap Graphics Context  

2010-06-19 02:14:22|  分类: cocoa |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Bitmap Graphics Context
比如,有时候,我们需要用程序来绘制一张图片的时候,通常就会用到 Bitmap Graphics Context.
创建Bitmap Graphics Context: 
CGContextRef CGBitmapContextCreate (
   void *data,
   size_t width,
   size_t height,
   size_t bitsPerComponent,
   size_t bytesPerRow,
   CGColorSpaceRef colorspace,
   CGBitmapInfo bitmapInfo
); 
参数:
data:是一个内存指针,用函数 malloc 申请,申请的内存空间大小一般是 bytesPerRow*height(比如,我们画一个50x100大小的32rgb位图,那么大小就是 4 x 50 x 100,因为每一个像素占了32个bit,也就是4bytes)
     也可以传入null
width: 图像宽度
height: 图像高度
bitsPerComponent: bpc(指每个像素的组成部分所占的bit),具体可以到这里查 http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-BCIBHHBB
bytesPerRow:每一行的byte数.
colorspace: Gray, RGB, CMYK, or NULL.在iphone 中,似乎用这个函数 CGColorSpaceCreateDeviceRGB()
bitmapInfo : 位图的布局信息,就是一个像素里的颜色颜色元素的排列方式,这个参数决定了前面的 bpc,详情请见:http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-CJBHEGIB


CGContextRef MyCreateBitmapContext (int pixelsWide,
                            int pixelsHigh)
{
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;
    
    //声明一个变量来代表每行的字节数。每一个位图像素的代表是4个字节,8bit红,8bit绿,8bit蓝,和8bit alpha通道信息(透明信息)。
    bitmapBytesPerRow   = (pixelsWide * 4);
    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);
 
    colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);// 创建一个通用的RGB色彩空间
    bitmapData = malloc( bitmapByteCount );// 调用的malloc函数来创建的内存用来存储位图数据块
    if (bitmapData == NULL)
    {
        fprintf (stderr, "Memory not allocated!");
        return NULL;
    }
    
    //创建一个位图图形上下文
    context = CGBitmapContextCreate (bitmapData,
                                    pixelsWide,
                                    pixelsHigh,
                                    8,      // bits per component
                                    bitmapBytesPerRow,
                                    colorSpace,
                                    kCGImageAlphaPremultipliedLast);
    if (context== NULL)
    {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
        return NULL;
    }
    //释放colorSpace 注意使用的函数
    CGColorSpaceRelease( colorSpace );
 
    return context;
}

CGRect myBoundingBox;

myBoundingBox = CGRectMake (0, 0, myWidth, myHeight);
myBitmapContext = MyCreateBitmapContext (400, 300);

CGContextSetRGBFillColor (myBitmapContext, 1, 0, 0, 1);
CGContextFillRect (myBitmapContext, CGRectMake (0, 0, 200, 100 ));
CGContextSetRGBFillColor (myBitmapContext, 0, 0, 1, .5);
CGContextFillRect (myBitmapContext, CGRectMake (0, 0, 100, 200 ));
//从一个图形上下文中创建Quartz二维图像
myImage = CGBitmapContextCreateImage (myBitmapContext);
//在其他的图形上下文中绘图
CGContextDrawImage(myContext, myBoundingBox, myImage);
char *bitmapData = CGBitmapContextGetData(myBitmapContext); 
//释放位图图形上下文当它不再需要。
CGContextRelease (myBitmapContext);
if (bitmapData) free(bitmapData); 
CGImageRelease(myImage);

抗锯齿(反走样)
使用函数CGContextSetShouldAntialias 和 CGContextSetAllowsAntialiasing 打开或者关闭抗锯齿, 使图像看起来更加的平滑
Bitmap Graphics Context - happy dog - 又一个部落格
 

  评论这张
 
阅读(1569)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017