gpt4 book ai didi

iphone - UIImage 的宝丽来滤镜

转载 作者:行者123 更新时间:2023-12-03 19:45:08 27 4
gpt4 key购买 nike

我正在尝试在 iPhone 中实现一些图像滤镜,例如宝丽来。我搜索了如何过滤现有的 UIImage 将其转换为 polaroid风格并遇到this堆栈溢出链接。以那里的答案为起点,我循环遍历图像的每个像素,获取 RGB 值,并将它们转换为 HSV,到目前为止我已经成功了。这就是我所做的(任何人都可以自由指出任何错误..)

double minRGB(double r, double g, double b){
if (r < g){
if (r < b){
return r;
}else {
return b;
}
}else {
if (g < b){
return g;
}else{
return b;
}
}
}



double maxRGB(double r, double g, double b){
if (r > g){
if (r > b){
return r;
}else {
return b;
}
}else {
if (g > b){
return g;
}else {
return b;
}
}
}

void rgbToHsv(double redIn,double greenIn,double blueIn,double *hue,double *saturation,double* value){
double min,max,delta;

min = minRGB(redIn,greenIn,blueIn);
max = maxRGB(redIn,greenIn,blueIn);
*value = max;
delta = max - min;
if (max != 0) {
*saturation = delta/max;
}else {
*saturation = 0;
*hue = -1.0;
return ;
}
if (redIn == max) {
*hue = (greenIn - blueIn)/delta;
}else if (greenIn == max) {
*hue = 2 + (blueIn - redIn)/delta;
}else {
*hue = 4 + (redIn - greenIn)/delta;
}
*hue *= 60.0;
if (*hue < 0) {
*hue += 360.0;
}
}

void hsvToRgb(double h,double s, double v, double *r,double *g, double *b){
int i;
float f, p, q, t;
if( s == 0 ) {
// achromatic (grey)
*r = *g = *b = v;
return;
}
h /= 60; // sector 0 to 5
i = floor( h );
f = h - i; // factorial part of h
p = v * ( 1 - s );
q = v * ( 1 - s * f );
t = v * ( 1 - s * ( 1 - f ) );
switch( i ) {
case 0:
*r = v;
*g = t;
*b = p;
break;
case 1:
*r = q;
*g = v;
*b = p;
break;
case 2:
*r = p;
*g = v;
*b = t;
break;
case 3:
*r = p;
*g = q;
*b = v;
break;
case 4:
*r = t;
*g = p;
*b = v;
break;
default: // case 5:
*r = v;
*g = p;
*b = q;
break;
}
}


-(void)makeImagePolaroid:(UIImage*)myImage{
CGImageRef originalImage = [myImage CGImage];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext = CGBitmapContextCreate(NULL,CGImageGetWidth(originalImage),CGImageGetHeight(originalImage),8,CGImageGetWidth(originalImage)*4,colorSpace,kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, CGBitmapContextGetWidth(bitmapContext), CGBitmapContextGetHeight(bitmapContext)), originalImage);
UInt8 *data = CGBitmapContextGetData(bitmapContext);
int numComponents = 4;
int bytesInContext = CGBitmapContextGetHeight(bitmapContext) * CGBitmapContextGetBytesPerRow(bitmapContext);
double redIn, greenIn, blueIn,alphaIn;
double hue,saturation,value;

for (int i = 0; i < bytesInContext; i += numComponents) {
redIn = (double)data[i]/255.0;
greenIn = (double)data[i+1]/255.0;
blueIn = (double)data[i+2]/255.0;
alphaIn = (double)data[i+3]/255.0;

rgbToHsv(redIn,greenIn,blueIn,&hue,&saturation,&value);

hue = hue * 0.7;
if (hue > 360) {
hue = 360;
}

saturation = saturation *1.3;
if (saturation > 1.0) {
saturation = 1.0;
}

value = value * 0.8;
if (value > 1.0) {
value = 1.0;
}

hsvToRgb(hue,saturation,value,&redIn,&greenIn,&blueIn);
data[i] = redIn * 255.0;
data[i+1] = greenIn * 255.0;
data[i+2] = blueIn * 255.0;
}
CGImageRef outImage = CGBitmapContextCreateImage(bitmapContext);
myImage = [UIImage imageWithCGImage:outImage];
CGImageRelease(outImage);
return myImage;
}

现在我对图像处理的想法非常幼稚(甚至不是业余的)。我读过this并尝试调整饱和度和色调,看看是否可以获得宝丽来效果。.我想我错过了一些东西,因为我得到了除了宝丽来之外的地球上的所有效果(说我没有得到任何东西)..

  1. 网上是否有任何文档(或书籍)讲述图像从程序员的角度进行过滤看法? (而不是在设计师的观点上 View 且无需 Photoshop截图)
  2. 色调、饱和度、明度是多少我必须在像素上做出改变这样我就可以拍出宝丽来照片了?
  3. 第三,我走的路正确吗?

提前致谢..

最佳答案

这可能会有所帮助,因为 Camera+ 从 Photoshop 中获取滤镜并将其复制到 iOS。

http://taptaptap.com/blog/creating-a-camera-plus-fx/

关于iphone - UIImage 的宝丽来滤镜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5590216/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com