Ang CoreImage ay isang framework ng Apple para sa real-time na pagproseso ng mga imahe at video, na nagbibigay ng dose-dosenang built-in na CIFilter para sa pagwawasto ng kulay, pag-blur, paglalagay ng texture at pag-detect. Ayon sa Apple Documentation, ginagamit ng CoreImage ang GPU para sa mataas na pagganap na pagproseso ng pixel sa mga iOS device. Ang framework ay sumusuporta sa CIImage bilang isang hindi nababagong object ng imahe at mga chain ng filter para sa komposisyon ng mga epekto nang walang pagkawala ng kalidad.
Mga pangunahing puntos
CoreImage ay isang framework ng Apple para sa pagproseso ng raster na imahe at video, unang ipinakilala sa macOS 10.4 Tiger at na-port sa iOS 5.0. Hindi tulad ng Core Graphics o UIKit, ang CoreImage ay gumagana sa antas ng pixel shader, gamit ang GPU para sa parallel na pag-compute. Ito ay nagbibigay-daan sa paglalapat ng mga kumplikadong epekto — pag-blur, pagwawasto ng kulay, morphing — sa mga imahe na may megapixel na resolusyon sa millisecond.
Ang arkitektura ng CoreImage ay binuo sa konsepto ng lazy evaluation: hindi ginagawa ng CIFilter ang pagproseso hanggang sa sandali ng rendering sa CIContext. Ang developer ay bumubuo ng isang chain ng ilang CIFilter, na ikinokonekta ang output ng isang filter sa input ng isa pa, at tanging ang tawag sa render ang nagpapasimula ng buong GPU pipeline. Ito ay nagpapaliit sa bilang ng mga pass sa graphics card at nagpapanatili ng pagganap.
Sinusuportahan ng CoreImage ang malawak na gamut ng kulay (P3, sRGB, linear sRGB), HDR na imahe at paggawa gamit ang 16-bit at 32-bit na pixel format. Sa mga device na may Neural Engine, maaaring pagsamahin ng CoreImage ang GPU shader sa Core ML para sa matalinong pagproseso — halimbawa, awtomatikong pagwawasto ng kulay batay sa machine learning, tulad ng ipinatupad sa Photos app sa iOS 17.
Tatlong pangunahing klase ang bumubuo sa core ng CoreImage: CIImage (data), CIFilter (operasyon) at CIContext (kapaligiran ng pagpapatupad). Bawat klase ay responsable para sa sarili nitong yugto sa pipeline at hindi pinaghahalo ang mga responsibilidad.
CIImage ay isang magaan na object na naglalarawan ng imahe ngunit hindi direktang naglalaman ng pixel data. Maaari itong malikha mula sa UIImage, CGImage, Metal texture, GL texture o file sa disk. Ang CIImage ay hindi nababago — bawat paglalapat ng filter ay lumilikha ng bagong CIImage nang hindi binabago ang orihinal. Ito ay nagbibigay-daan sa pagbuo ng mga chain ng pagbabago nang hindi kinokopya ang data sa pagitan ng mga hakbang.
Mahalagang tampok: ang CIImage ay hindi nakatali sa resolution ng screen o espasyo ng kulay hanggang sa sandali ng rendering. Ang parehong CIImage ay maaaring i-render sa UIImage para sa screen at sa TIFF file para sa pag-print na may iba’t ibang parameter — awtomatikong iniaangkop ng CoreImage ang pagproseso sa target na konteksto.
CIFilter ay ang pangunahing klase para sa paglalapat ng mga epekto. Bawat CIFilter ay kumakatawan sa isang shader program na may mga input parameter (inputImage, inputIntensity, inputRadius atbp.) at isang output na imahe. Ang Apple ay naghahatid ng higit sa 200 built-in na CIFilter, na naka-grupo sa mga kategorya: CICategoryColorEffect (pagwawasto ng kulay), CICategoryBlur (pag-blur), CICategoryStylize (pag-istilo), CICategoryGeometryAdjust (mga pagbabagong geometriko).
Upang lumikha ng isang custom na CIFilter, ang developer ay nagsusulat ng Metal shader (CIKernel) — isang fragment shader sa wikang Metal Shading Language na nagpoproseso ng bawat pixel nang nakapag-iisa. Pagkatapos ng compilation, ang shader ay nirerehistro bilang isang subclass ng CIFilter at maaaring gamitin sa mga chain kasama ng built-in na Apple filters.
| Kategorya | Halimbawa ng filter | Layunin |
|---|---|---|
| ColorEffect | CIColorControls | Liwanag, contrast, saturation |
| Blur | CIGaussianBlur | Gaussian blur na may adjustable radius |
| Stylize | CIPixellate | Pikselasyon ng imahe na may tinukoy na scale |
| GeometryAdjust | CIAffineTransform | Pag-ikot, scale, paglipat sa pamamagitan ng affine matrix |
| Composite | CISourceOverCompositing | Pagpapatong ng mga imahe na may alpha channel |
CIContext ay isang mabigat na object na namamahala sa paglalaan ng GPU resources, compilation ng shader at buffering. Ang paglikha ng CIContext ay isang mahal na operasyon, kaya inirerekomenda ng Apple na likhain ito nang isang beses para sa buong lifecycle ng app at muling gamitin. Ang konteksto ay nakatali sa isang partikular na GPU (Metal, OpenGL) o CPU at tinutukoy ang espasyo ng kulay ng output na imahe.
Ang CIFilter library ay patuloy na lumalawak: ang iOS 17 ay nagdagdag ng mga bagong filter para sa HDR processing at machine learning. Lahat ng built-in na filter ay dokumentado sa Apple Developer Documentation at maaaring hanapin ayon sa kategorya o pangalan. Para sa pag-detect ng mga available na filter sa device, gamitin ang CIFilter.filterNames(inCategory:).
Ang pangunahing kakayahan ng CoreImage — komposisyon ng maraming CIFilter sa isang chain. Ang output ng isang filter ay ibinibigay sa input ng susunod sa pamamagitan ng parameter na inputImage. Ino-optimize ng CoreImage ang chain sa yugto ng rendering: ang mga katabing filter na gumagana sa parehong espasyo ng kulay ay pinagsama sa isang GPU pass (kernel fusion). Nagbibigay ito ng pagtaas sa pagganap nang walang interbensyon ng developer.
Upang lumikha ng sariling epekto, ang developer ay nagsusulat ng Metal function na may annotation na [[kernel]]. Ang function ay tumatanggap ng pixel coordinates at nagbabalik ng kulay. Ipinapadala ng CoreImage ang shader sa GPU, kung saan ito ay isinasagawa nang parallel para sa lahat ng pixel ng imahe. Ang mga custom na filter ay lalong kapaki-pakinabang para sa mga natatanging visual effect: sepia na may non-linear curve, dispersion blur o imitasyon ng film grain.
#include <CoreImage/CoreImage.h>
[[kernel]] float4 customFilter(sample_t s, float intensity) {
float4 result;
result.rgb = s.rgb * (1.0 - intensity) + s.r * intensity;
result.a = s.a;
return result;
}
CoreImage ay awtomatikong namamahala ng cache ng mga intermediate na resulta. Kung ang parehong chain ng filter ay inilapat sa iba’t ibang mga imahe, maaaring gamitin muli ng CoreImage ang mga na-compile na shader. Para sa maximum na pagganap, iwasan ang paglikha ng CIContext para sa bawat frame — gumamit ng isang konteksto at muling itakda ang mga input parameter ng filter.
CIDetector ay ang subsystem ng CoreImage para sa pag-detect ng mga semantikong bagay sa imahe nang hindi gumagamit ng Vision o Core ML. Ang CIDetector ay sumusuporta sa apat na uri ng detection: mukha (CIDetectorTypeFace), teksto (CIDetectorTypeText), QR code (CIDetectorTypeQRCode) at parihaba (CIDetectorTypeRectangle). Ang detector ay gumagana sa CPU na may optimization para sa NEON instructions, na tinitiyak ang matatag na bilis sa mga device na walang malakas na GPU.
Ang face detector na CIDetectorTypeFace ay nagbabalik ng array ng CIFaceFeature na may mga coordinate ng hangganan ng mukha, posisyon ng mga mata at bibig. Mula noong iOS 12, tinutukoy din ng CIDetector ang ngiti (hasSmile) at posisyon ng kaliwang/kanang mata (leftEyeClosed, rightEyeClosed). Ang katumpakan ng detection ay sapat para sa karamihan ng AR at photo applications, ngunit para sa kritikal na mga senaryo, inirerekomenda ng Apple ang Vision.framework.
CIDetectorTypeRectangle ay nakakahanap ng mga parihabang lugar sa imahe — mga dokumento, business card, screen ng device. Ang detector ay nagbabalik ng CIRectangleFeature na may apat na puntos na bumubuo sa contour ng parihaba. Ayon sa WWDC 2024, ang rectangle detector ay gumagamit ng parehong neural network architecture tulad ng Vision, ngunit may mas mababang paggamit ng memory. Ginagawa nitong mas gusto para sa real-time na pagproseso ng stream ng frame, halimbawa sa mga document scanner app.
Mga praktikal na halimbawa ay makakatulong na patatagin ang pag-unawa sa CoreImage. Tingnan natin ang dalawang karaniwang senaryo: paglalapat ng color filter sa isang larawan at face detection na may pagguhit ng frame.
Pangunahing halimbawa ng CISepiaTone filter, na nagko-convert ng kulay na imahe sa sepia tones. Ang filter ay tumatanggap ng parameter na inputIntensity mula 0 (orihinal) hanggang 1 (maximum effect). Pansinin ang lazy evaluation: ang CIImage na ibinalik ng filter.outputImage ay hindi naglalaman ng mga pixel — ang rendering ay nangyayari lamang sa pagtawag ng context.createCGImage.
import CoreImage
guard let inputImage = CIImage(image: uiImage) else { return }
let filter = CIFilter(name: "CISepiaTone")
filter?.setValue(inputImage, forKey: kCIInputImageKey)
filter?.setValue(0.8, forKey: kCIInputIntensityKey)
let context = CIContext()
let outputImage = filter?.outputImage
let cgImage = context.createCGImage(outputImage!, from: inputImage.extent)
let resultImage = UIImage(cgImage: cgImage!)
Ang sumusunod na halimbawa ay gumagamit ng CIDetector upang maghanap ng mga mukha sa imahe at gumuhit ng parihaba sa paligid ng bawat natagpuang mukha. Ang CIFaceFeature ay naglalaman ng mga coordinate sa sistema ng imahe (simula sa kaliwang sulok sa ibaba), kaya sa pagguhit sa UIKit ay kinakailangan ang pagbabago ng coordinate sa pamamagitan ng affine transform.
let detector = CIDetector(
ofType: CIDetectorTypeFace,
context: context,
options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]
)
let features = detector?.features(in: inputImage) as? [CIFaceFeature]
for face in features ?? [] {
print("Face bounds: \(face.bounds)")
if face.hasSmile {
print("Ngumiti ang tao")
}
}
Ang huling halimbawa ay nagpapakita ng chain ng tatlong filter: color correction, vignette at texture application. Pansinin na ang outputImage ng unang filter ay ipinapasa bilang inputImage sa pangalawa — nang walang intermediate rendering. Sa pagtawag ng createCGImage, pinagsasama ng CoreImage ang lahat ng tatlong operasyon sa isang GPU pass.
let colorFilter = CIFilter(name: "CIColorControls")
colorFilter?.setValue(inputImage, forKey: kCIInputImageKey)
colorFilter?.setValues([
kCIInputBrightnessKey: 0.1,
kCIInputContrastKey: 1.2
])
let vignetteFilter = CIFilter(name: "CIVignette")
vignetteFilter?.setValue(colorFilter?.outputImage, forKey: kCIInputImageKey)
vignetteFilter?.setValue(2.0, forKey: "inputRadius")
let finalImage = vignetteFilter?.outputImage
let result = context.createCGImage(finalImage!, from: inputImage.extent)
Mga madalas itanong
CoreImage ay gumagana sa GPU at na-optimize para sa pixel operations (mga filter, color correction), habang ang Core Graphics ay isang CPU library para sa vector drawing at 2D context. Ang CoreImage ay mas mabilis para sa maramihang pagproseso ng imahe, ang Core Graphics ay mas tumpak para sa step-by-step na pagguhit ng interface.
Oo — sinusuportahan ng CoreImage ang pagproseso ng indibidwal na video frame sa pamamagitan ng AVPlayerItemVideoOutput o AVCaptureOutput. Para sa streaming processing, gamitin ang AVVideoComposition with CIFilter, na nagbibigay-daan sa paglalapat ng mga epekto nang hindi kinokopya ang mga frame sa pagitan ng CPU at GPU.
CoreImage ay gumagana bilang default sa working color space na sRGB (kCGColorSpaceSRGB). Sa paglikha ng CIContext, maaari kang tumukoy ng alternatibong espasyo — extended linear sRGB para sa HDR o Display P3 para sa mga display na may malawak na gamut.
Walang limitasyon sa bilang ng mga filter sa isang chain, ngunit bawat 5–7 magkakasunod na filter ay lumilikha ng karagdagang GPU pass. Para sa higit sa 10 filter, inirerekomenda na hatiin ang chain sa mga grupo at i-render ang mga intermediate na resulta upang maiwasan ang paglampas sa limitasyon ng rehistro ng shader.
Oo — ang CIDetector ay gumagana sa CPU gamit ang NEON instructions sa lahat ng device na may iOS 5.0 at mas bago. Ang katumpakan ng detection ay pareho sa lahat ng device, ngunit ang bilis ay mas mataas sa Apple A12+ chips dahil sa hardware acceleration ng neural networks.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din