gpt4 book ai didi

iPhone 油漆桶

转载 作者:行者123 更新时间:2023-11-29 13:41:48 26 4
gpt4 key购买 nike

我正在 iPhone 应用程序中实现一个填充油漆桶工具,但遇到了一些问题。用户能够绘画,我希望油漆桶允许他们点击一个点并填充所有连接的那种颜色。

这是我的想法:1)从用户选择的点开始2) 将检查的点保存到 NSMutableArray 中,这样它们就不会被重新检查3)如果当前点的像素颜色与原来点击的点相同,保存到一个数组中,以后可以更改4) 如果当前点的像素颜色与原来的不同,则返回。 (边界)5) 完成扫描后,遍历要更改的像素阵列并将它们设置为新颜色。

但目前还没有成功。任何有关如何执行此操作的帮助或知识将不胜感激!这是我的代码。

-(void)flood:(int)x:(int)y
{

//NSLog(@"Flood %i %i", x, y);

CGPoint point = CGPointMake(x, y);
NSValue *value = [NSValue valueWithCGPoint:point];

//Don't repeat checked pixels
if([self.checkedFloodPixels containsObject:value])
{
return;
}

else
{
//If not checked, mark as checked
[self.checkedFloodPixels addObject:value];

//Make sure in bounds
if([self isOutOfBounds:x:y] || [self reachedStopColor:x:y])
{
return;
}


//Go to adjacent points
[self flood:x+1:y];
[self flood:x-1:y];
[self flood:x:y+1];
[self flood:x:y-1];
}
}

- (BOOL)isOutOfBounds:(int)x:(int)y
{
BOOL outOfBounds;

if(y > self.drawImage.frame.origin.y && y < (self.drawImage.frame.origin.y + self.drawImage.frame.size.height))
{
if(x > self.drawImage.frame.origin.x && x < (self.drawImage.frame.origin.x + self.drawImage.frame.size.width))
{
outOfBounds = NO;
}

else
{
outOfBounds = YES;
}
}

else
{
outOfBounds = YES;
}

if(outOfBounds)
NSLog(@"Out of bounds");

return outOfBounds;
}

- (BOOL)reachedStopColor:(int)x:(int)y
{
CFDataRef theData = CGDataProviderCopyData(CGImageGetDataProvider(self.drawImage.image.CGImage));

const UInt8 *pixelData = CFDataGetBytePtr(theData);

int red = 0;
int green = 1;
int blue = 2;

//RGB for point being checked
float newPointR;
float newPointG;
float newPointB;

//RGB for point initially clicked
float oldPointR;
float oldPointG;
float oldPointB;

int index;
BOOL reachedStopColor = NO;


//Format oldPoint RBG - pixels are every 4 bytes so round to 4
index = lastPoint.x * lastPoint.y;

if(index % 4 != 0)
{
index -= 2;
index /= 4;
index *= 4;
}

//Get into 0.0 - 1.0 value
oldPointR = pixelData[index + red];
oldPointG = pixelData[index + green];
oldPointB = pixelData[index + blue];

oldPointR /= 255.0;
oldPointG /= 255.0;
oldPointB /= 255.0;

oldPointR *= 1000;
oldPointG *= 1000;
oldPointB *= 1000;

int oldR = oldPointR;
int oldG = oldPointG;
int oldB = oldPointB;

oldPointR = oldR / 1000.0;
oldPointG = oldG / 1000.0;
oldPointB = oldB / 1000.0;

//Format newPoint RBG
index = x*y;

if(index % 4 != 0)
{
index -= 2;
index /= 4;
index *= 4;
}

newPointR = pixelData[index + red];
newPointG = pixelData[index + green];
newPointB = pixelData[index + blue];

newPointR /= 255.0;
newPointG /= 255.0;
newPointB /= 255.0;

newPointR *= 1000;
newPointG *= 1000;
newPointB *= 1000;

int newR = newPointR;
int newG = newPointG;
int newB = newPointB;

newPointR = newR / 1000.0;
newPointG = newG / 1000.0;
newPointB = newB / 1000.0;

//Check if different color
if(newPointR < (oldPointR - 0.02f) || newPointR > (oldPointR + 0.02f))
{
if(newPointG < (oldPointG - 0.02f) || newPointG > (oldPointG + 0.02f))
{
if(newPointB < (oldPointB - 0.02f) || newPointB > (oldPointB + 0.02f))
{
reachedStopColor = YES;
NSLog(@"Different Color");
}

else
{
NSLog(@"Same Color3");

NSNumber *num = [NSNumber numberWithInt:index];
[self.pixelsToChange addObject:num];
}
}

else
{
NSLog(@"Same Color2");

NSNumber *num = [NSNumber numberWithInt:index];
[self.pixelsToChange addObject:num];
}
}

else
{
NSLog(@"Same Color1");

NSNumber *num = [NSNumber numberWithInt:index];
[self.pixelsToChange addObject:num];
}

CFRelease(theData);

if(reachedStopColor)
NSLog(@"Reached stop color");

return reachedStopColor;
}

-(void)fillAll
{
CGContextRef ctx;
CGImageRef imageRef = self.drawImage.image.CGImage;
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);

int red = 0;
int green = 1;
int blue = 2;

int index;
NSNumber *num;

for(int i = 0; i < [self.pixelsToChange count]; i++)
{
num = [self.pixelsToChange objectAtIndex:i];

index = [num intValue];

rawData[index + red] = (char)[[GameManager sharedManager] RValue];
rawData[index + green] = (char)[[GameManager sharedManager] GValue];
rawData[index + blue] = (char)[[GameManager sharedManager] BValue];
}

ctx = CGBitmapContextCreate(rawData,
CGImageGetWidth( imageRef ),
CGImageGetHeight( imageRef ),
8,
CGImageGetBytesPerRow( imageRef ),
CGImageGetColorSpace( imageRef ),
kCGImageAlphaPremultipliedLast );

imageRef = CGBitmapContextCreateImage (ctx);
UIImage* rawImage = [UIImage imageWithCGImage:imageRef];

CGContextRelease(ctx);

self.drawImage.image = rawImage;

free(rawData);
}

最佳答案

所以我发现了这个(我知道这个问题现在可能无关紧要,但对于那些仍在寻找类似东西的人来说,它不是):

从上下文中获取像素的颜色(来自 here 的修改代码):

- (UIColor*) getPixelColorAtLocation:(CGPoint)point {
UIColor* color;
CGContextRef cgctx = UIGraphicsGetCurrentContext();

unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
int offset = 4*((ContextWidth*round(point.y))+round(point.x)); //i dont know how to get ContextWidth from current context so i have it as a instance variable in my code
int alpha = data[offset];
int red = data[offset+1];
int green = data[offset+2];
int blue = data[offset+3];
color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];
}

if (data) { free(data); }

return color;

和填充算法:是here

这就是我正在使用的,但与 CGPath 绘图样式相比,填充本身非常慢。如果你在屏幕外渲染和/或你像这样动态填充它看起来有点酷:

here

关于iPhone 油漆桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8887260/

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