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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

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

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

什么是Bitmap?

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

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


數(shù)據(jù)類型CGImageRef

在Quartz中,Bitmap的數(shù)據(jù)由CGImageRef封裝。由以下幾個(gè)函數(shù)可以創(chuàng)建CGImageRef對象

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


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

先看看一個(gè)方法,創(chuàng)建bitmap context-CGBitmapContextCreate
函數(shù)體

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

參數(shù)

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

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

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這個(gè)方法

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
);

參數(shù)

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


UIKit中的Bitmap

成對使用來創(chuàng)建bitmap context,進(jìn)行繪制

UIGraphicsBeginImageContext

UIGraphicsEndImageContext

通過一下方法來獲取當(dāng)前context就可以繪制了。

UIGraphicsGetCurrentContext

然后通過,UIGraphicsGetImageFromCurrentImageContext來生成圖片

例如
調(diào)整圖片的大小

+ (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();

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。