圖片解碼
為了使圖片渲染更加流暢根竿,SDWebImage對下載的圖片進(jìn)行了解碼操作。
先看下幾個常量
每個像素占用內(nèi)存多少個字節(jié)
static const size_t kBytesPerPixel =4;
表示每一個組件占多少位,因?yàn)镽GBA,其中R(紅色)G(綠色)B(藍(lán)色)A(透明度)是4個組件,每個像素由這4個組件組成抱怔,所以每像素就是8*4 = 32位
static const size_t kBitsPerComponent = 8;
1M占的字節(jié)數(shù)
static const CGFloat kBytesPerMB = 1024.0f * 1024.0f;
1M占的像素數(shù)
static const CGFloat kPixelsPerMB = kBytesPerMB / kBytesPerPixel;
思考:
我們可以根據(jù)這個計算一張圖片解碼后的內(nèi)存大小
圖片占用的字節(jié)
width*scale*height*scale/tkBytesPerPixel
圖片占用多少M(fèi)
width*scale*height*scale/tkBytesPerPixel/kPixelsPerMB
+ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image {
//過濾有透明因素的圖片
if (![UIImage shouldDecodeImage:image]) {
return image;
}
// autorelease 防止內(nèi)存某一時刻過高,以及內(nèi)存警告時釋放內(nèi)存
@autoreleasepool{
CGImageRef imageRef = image.CGImage;
//顏色空間
CGColorSpaceRef colorspaceRef = [UIImage colorSpaceForImageRef:imageRef];
size_t width = CGImageGetWidth(imageRef);
size_t height = CGImageGetHeight(imageRef);
//計算出每行行的像素數(shù)
size_t bytesPerRow = kBytesPerPixel * width;
// kCGImageAlphaNone is not supported in CGBitmapContextCreate.這里創(chuàng)建的contexts是沒有透明因素的(位圖圖形上下文)蚓炬,為了防止渲染控件的時候直接忽略掉其下方的圖層
CGContextRef context = CGBitmapContextCreate(NULL,
width,
height,
kBitsPerComponent,
bytesPerRow,
colorspaceRef,
kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast);
if (context == NULL) {
return image;
}
// Draw the image into the context and retrieve the new bitmap image without alpha
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGImageRef imageRefWithoutAlpha = CGBitmapContextCreateImage(context);
//image.imageOrientation由于使用CoreGraphics繪制圖片的Y坐標(biāo)和UIKit的Y坐標(biāo)相反熏兄,這時要要把圖片正古來
UIImage *imageWithoutAlpha = [UIImage imageWithCGImage:imageRefWithoutAlpha
scale:image.scale
orientation:image.imageOrientation];
CGContextRelease(context);
CGImageRelease(imageRefWithoutAlpha);
return imageWithoutAlpha;
}
}