版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】iOS中圖片縮略技術(shù)有哪些
UIKitUIGraphicsBeginImageContextWithOptions&UIImage-drawInRect:extension
UIImage
{
//UIKit
func
resizeUI(size:
CGSize)
->
UIImage?
{
let
hasAlpha
=
false
let
scale:
CGFloat
=
0.0
//
Automatically
use
scale
factor
of
main
screen
/**
創(chuàng)建一個(gè)圖片類型的上下文。調(diào)用UIGraphicsBeginImageContextWithOptions函數(shù)就可獲得用來處理圖片的圖形上下文。利用該上下文,你就可以在其上進(jìn)行繪圖,并生成圖片
size:表示所要?jiǎng)?chuàng)建的圖片的尺寸
opaque:表示這個(gè)圖層是否完全透明,如果圖形完全不用透明最好設(shè)置為YES以優(yōu)化位圖的存儲,這樣可以讓圖層在渲染的時(shí)候效率更高
scale:指定生成圖片的縮放因子,這個(gè)縮放因子與UIImage的scale屬性所指的含義是一致的。傳入0則表示讓圖片的縮放因子根據(jù)屏幕的分辨率而變化,所以我們得到的圖片不管是在單分辨率還是視網(wǎng)膜屏上看起來都會(huì)很好
*/
UIGraphicsBeginImageContextWithOptions(size,
!hasAlpha,
scale)
self.draw(in:
CGRect(origin:
.zero,
size:
size))
let
resizedImage
=
UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return
resizedImage!
}
}CoreGraphicsCGBitmapContextCreate&CGContextDrawImageextension
UIImage
{
//CoreGraphics
func
resizeCG(size:CGSize)
->
UIImage?
{
guard
let
cgImage
=
self.cgImage
else
{
return
nil
}
let
bitsPerComponent
=
cgImage.bitsPerComponent
let
bytesPerRow
=
cgImage.bytesPerRow
let
colorSpace
=
cgImage.colorSpace
let
bitmapInfo
=
cgImage.bitmapInfo
guard
let
context
=
CGContext(data:
nil,
width:
Int(size.width),
height:
Int(size.height),
bitsPerComponent:
bitsPerComponent,
bytesPerRow:
bytesPerRow,
space:
colorSpace!,
bitmapInfo:
bitmapInfo.rawValue)
else
{
return
nil
}
erpolationQuality
=
.high
context.draw(cgImage,
in:
CGRect(origin:
.zero,
size:
size))
let
resizedImage
=
context.makeImage().flatMap
{
UIImage(cgImage:
$0)
}
return
resizedImage
}
}/upload/information/20200623/126/119325.gifImageIOCGImageSourceCreateThumbnailAtIndexextension
UIImage
{
//ImageIO
func
resizeIO(size:CGSize)
->
UIImage?
{
guard
let
data
=
UIImagePNGRepresentation(self)
else
{
return
nil
}
let
maxPixelSize
=
max(size.width,
size.height)
//let
imageSource
=
CGImageSourceCreateWithURL(url,
nil)
guard
let
imageSource
=
CGImageSourceCreateWithData(data
as
CFData,
nil)
else
{
return
nil
}
//kCGImageSourceThumbnailMaxPixelSize為生成縮略圖的大小。當(dāng)設(shè)置為800,如果圖片本身大于800*600,則生成后圖片大小為800*600,如果源圖片為700*500,則生成圖片為800*500
let
options:
[NSString:
Any]
=
[
kCGImageSourceThumbnailMaxPixelSize:
maxPixelSize,
kCGImageSourceCreateThumbnailFromImageAlways:
true
]
let
resizedImage
=
CGImageSourceCreateImageAtIndex(imageSource,
0,
options
as
CFDictionary).flatMap{
UIImage(cgImage:
$0)
}
return
resizedImage
}
}CoreImageextension
UIImage
{
//CoreImage
func
resizeCI(size:CGSize)
->
UIImage?
{
guard
let
cgImage
=
self.cgImage
else
{
return
nil
}
let
scale
=
(Double)(size.width)
/
(Double)(self.size.width)
let
image
=
CIImage(cgImage:
cgImage)
let
filter
=
CIFilter(name:
"CILanczosScaleTransform")!
filter.setValue(image,
forKey:
kCIInputImageKey)
filter.setValue(NSNumber(value:scale),
forKey:
kCIInputScaleKey)
filter.setValue(1.0,
forKey:kCIInputAspectRatioKey)
guard
let
outputImage
=
filter.value(forKey:
kCIOutputImageKey)
as?
CIImage
else
{
return
nil}
let
context
=
CIContext(options:
[kCIContextUseSoftwareRenderer:
false])
let
resizedImage
=
context.createCGImage(outputImage,
from:
outputImage.extent).flatMap
{
UIImage(cgImage:
$0)
}
return
resizedImage
}
}/upload/information/20200623/126/119326.gifvImageextension
UIImage
{
//vImage
func
resizeVI(size:CGSize)
->
UIImage?
{
guard
let
cgImage
=
self.cgImage
else
{
return
nil
}
var
format
=
vImage_CGImageFormat(bitsPerComponent:
8,
bitsPerPixel:
32,
colorSpace:
nil,
bitmapInfo:
CGBitmapInfo(rawValue:
CGImageAlphaInfo.first.rawValue),
version:
0,
decode:
nil,
renderingIntent:
.defaultIntent)
var
sourceBuffer
=
vImage_Buffer()
defer
{
free(sourceBuffer.data)
}
var
error
=
vImageBuffer_InitWithCGImage(&sourceBuffer,
&format,
nil,
cgImage,
numericCast(kvImageNoFlags))
guard
error
==
kvImageNoError
else
{
return
nil
}
//
create
a
destination
buffer
let
scale
=
self.scale
let
destWidth
=
Int(size.width)
let
destHeight
=
Int(size.height)
let
bytesPerPixel
=
cgImage.bitsPerPixel
/
8
let
destBytesPerRow
=
destWidth
*
bytesPerPixel
let
destData
=
UnsafeMutablePointer<UInt8>.allocate(capacity:
destHeight
*
destBytesPerRow)
defer
{
destData.deallocate(capacity:
destHeight
*
destBytesPerRow)
}
var
destBuffer
=
vImage_Buffer(data:
destData,
height:
vImagePixelCount(destHeight),
width:
vImagePixelCount(destWidth),
rowBytes:
destBytesPerRow)
//
scale
the
image
error
=
vImageScale_ARGB8888(&sourceBuffer,
&destBuffer,
nil,
numericCast(kvImageHighQualityResampling))
guard
error
==
kvImageNoError
else
{
return
nil
}
//
create
a
CGImage
from
vImage_Buffer
var
destCGImage
=
vImageCreateCGImageFromBuffer(&destBuffer,
&format,
nil,
nil,
numericCast(kvImageNoFlags),
&error)?.takeRetainedValue()
guard
error
==
kvImageNoError
else
{
return
nil
}
//
create
a
UIImage
let
re
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第19課 科學(xué)技術(shù)的重大成果課件
- 2024年專業(yè)電工施工協(xié)議典范
- 中國特色社會(huì)主義基本原理(上)
- 2024年度層電梯廳裝潢協(xié)議模板
- 2024年無薪實(shí)習(xí)勞動(dòng)協(xié)議
- 2024年倉庫租賃法律協(xié)議細(xì)則
- 2024年型車輛采購協(xié)議
- 2024屆安徽省合肥高升學(xué)校高三八校第一次適應(yīng)性考試數(shù)學(xué)試題試卷
- 2024建筑業(yè)勞務(wù)施工協(xié)議文本
- 2023-2024學(xué)年浙江省溫州市九校下期第二次質(zhì)量考評(3月)高三數(shù)學(xué)試題
- 網(wǎng)絡(luò)工程職業(yè)生涯展示
- 《汽車鈑金噴涂技術(shù)》 課件 任務(wù)11.2車身鋼制外板外形修復(fù)機(jī)修復(fù)
- 不銹鋼電鍍工藝流程
- IgG4相關(guān)疾病的護(hù)理查房
- 景區(qū)服務(wù)提升培訓(xùn)課件
- 體育行業(yè)的運(yùn)動(dòng)場館安全規(guī)范培訓(xùn)
- 小區(qū)大門改進(jìn)方案
- 醫(yī)院建設(shè)目標(biāo)及規(guī)劃
- 2024年中考?xì)v史九年級上冊重點(diǎn)知識點(diǎn)復(fù)習(xí)提綱(部編版)
- 眼科門診經(jīng)營方案
- 《聲聲慢(尋尋覓覓)》
評論
0/150
提交評論