日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

iOS 2D绘图详解(Quartz 2D)之Bitmap

發布時間:2024/6/21 综合教程 44 生活家
生活随笔 收集整理的這篇文章主要介紹了 iOS 2D绘图详解(Quartz 2D)之Bitmap 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是Bitmap?

Bitmap叫做位圖,每一個像素點由1-32bit組成。每個像素點包括多個顏色組件和一個Alpha組件(例如:RGBA)。

iOS中指出如下格式的圖片 JPEG, GIF, PNG, TIF, ICO, GMP, XBM,和 CUR。其他格式的圖片要給Quartz2D傳入圖片的數據分布信息。


數據類型CGImageRef

在Quartz中,Bitmap的數據由CGImageRef封裝。由以下幾個函數可以創建CGImageRef對象

CGImageCreate - 最靈活,但也是最復雜的一種方式,要傳入11個參數,這個方法最后講解。
CGImageSourceCreate-ImageAtIndex-通過已經存在的Image對象來創建
CGImageSourceCreate-ThumbnailAtIndex- 和上一個函數類似,不過這個是創建縮略圖
CGBitmapContextCreateImage - 通過Copy Bitmap Graphics來創建
CGImageCreateWith-ImageInRect -通過在某一個矩形內數據來創建


例子一,在一個bitmap context繪制,并且重新生成一張圖片

先看看一個方法,創建bitmap context-CGBitmapContextCreate
函數體

CGContextRef _Nullable CGBitmapContextCreate (
   void * _Nullable data,
   size_t width,
   size_t height,
   size_t bitsPerComponent,
   size_t bytesPerRow,
   CGColorSpaceRef _Nullable space,
   uint32_t bitmapInfo
);

參數

data 是一個指針,指向存儲繪制的bitmap context的實際數據的地址,最少大小為bytesPerRow* height.可以傳入null,讓quartz自動分配計算
width/height bitmap的寬度,高度,以像素為單位
bytesPerRow 每一行的byte數目。如果data傳入null,這里傳入0,則會自動計算
一個component占據多少位。對于32bit的RGBA空間,則是8(8*4=32)。
space 顏色空間,一般就是DeviceRGB
bitmapInfo,一個常量,指定了是否具有alpha通道,alpha通道的位置,像素點存儲的數據類型是float還是Integer等信息。

其中bitmapInfo可以傳入的參數如下,通過名字就能看出來,這里不加注釋了

enum CGImageAlphaInfo {
   kCGImageAlphaNone,
   kCGImageAlphaPremultipliedLast,
   kCGImageAlphaPremultipliedFirst,
   kCGImageAlphaLast,
   kCGImageAlphaFirst,
   kCGImageAlphaNoneSkipLast,
   kCGImageAlphaNoneSkipFirst,
   kCGImageAlphaOnly 
};

原圖(1280*800)

效果

重新繪制成200*100,并在圖片中間加上我們自定義的繪制

代碼

    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
    CGSize targetSize = CGSizeMake(200, 100);
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
                                                       targetSize.width,
                                                       targetSize.height,
                                                       8,
                                                       targetSize.width * 4,
                                                       rgb,
                                                    kCGImageAlphaPremultipliedFirst);
    CGRect imageRect;
    imageRect.origin = CGPointMake(0, 0);
    imageRect.size = targetSize;
    UIImage * imageToDraw = [UIImage imageNamed:@"image.jpg"];
    CGContextDrawImage(bitmapContext,imageRect,imageToDraw.CGImage);
    CGContextAddArc(bitmapContext,100,40, 20,M_PI_4, M_PI_2, true);
    CGContextSetLineWidth(bitmapContext, 4.0);
    CGContextStrokePath(bitmapContext);


    CGImageRef imageRef = CGBitmapContextCreateImage(bitmapContext);
    UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];

    CGImageRelease(imageRef);
    CGContextRelease(bitmapContext);
    CGColorSpaceRelease(rgb);

    UIImageView * imageView = [[UIImageView alloc] initWithImage:image];
    imageView.center = self.view.center;
    [self.view addSubview:imageView];

例子二,截取圖片的一部分

效果

代碼

    UIImage * imageToDraw = [UIImage imageNamed:@"image.jpg"];
    CGImageRef partImageRef = CGImageCreateWithImageInRect(imageToDraw.CGImage, CGRectMake(0, 0,300, 200));
    UIImage * partImage = [[UIImage alloc] initWithCGImage:partImageRef];
    UIImageView * imageView = [[UIImageView alloc] initWithImage:partImage];
    imageView.center = self.view.center;
    [self.view addSubview:imageView];

看看CGImageCreate這個方法

CGImageRef _Nullable CGImageCreate (
   size_t width,
   size_t height,
   size_t bitsPerComponent,
   size_t bitsPerPixel,
   size_t bytesPerRow,
   CGColorSpaceRef _Nullable space,
   CGBitmapInfo bitmapInfo,
   CGDataProviderRef _Nullable provider,
   const CGFloat * _Nullable decode,
   bool shouldInterpolate,
   CGColorRenderingIntent intent
);

參數

width/height 圖片的像素寬度,高度
bitsPerComponent 每個component的占用bit個數,和上文提到的一樣
bitsPerPixel 每個像素點占用的bit個數。例如32bit RGBA中,就是32
bytesPerRow 每一行占用的byte個數
colorspace 顏色空間
bitmapInfo 和上文提到的那個函數一樣
provider bitmap的數據源
decode 解碼array,傳入null,則保持原始數據
interpolation 是否要像素差值來平滑圖像
intent 指定了從一個顏色空間map到另一個顏色空間的方式


UIKit中的Bitmap

成對使用來創建bitmap context,進行繪制

UIGraphicsBeginImageContext

UIGraphicsEndImageContext

通過一下方法來獲取當前context就可以繪制了。

UIGraphicsGetCurrentContext

然后通過,UIGraphicsGetImageFromCurrentImageContext來生成圖片

例如
調整圖片的大小

+ (UIImage*)imageWithImage:(UIImage*)image
              scaledToSize:(CGSize)newSize;
{
    UIGraphicsBeginImageContext( newSize );
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

截屏

   UIWindow * keyWindow = [UIApplication sharedApplication].keyWindow;
    UIGraphicsBeginImageContextWithOptions(keyWindow.bounds.size, NO, [UIScreen mainScreen].scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [keyWindow.layer renderInContext:context];
    UIImage * screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

總結

以上是生活随笔為你收集整理的iOS 2D绘图详解(Quartz 2D)之Bitmap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。