Iphone iPad中的洪水填充速度太慢

Iphone iPad中的洪水填充速度太慢,iphone,objective-c,ipad,flood-fill,Iphone,Objective C,Ipad,Flood Fill,我在iPad上的一个着色应用程序中使用flood Filling 该应用程序基本上填充了图像黑线内的颜色,我可以毫无问题地完成这项工作,但速度太慢了 我首先使用了递归泛洪填充,它的性能是最差的(由于堆栈溢出),然后我可以使用下面的代码将其转换为迭代堆栈,但这太慢了 -(void)floodFillAtPoint:(CGPoint)atPoint { Stack *stack = [[Stack alloc] init]; [stack push:[StackPoint pointWithPo

我在iPad上的一个着色应用程序中使用flood Filling

该应用程序基本上填充了图像黑线内的颜色,我可以毫无问题地完成这项工作,但速度太慢了

我首先使用了递归泛洪填充,它的性能是最差的(由于堆栈溢出),然后我可以使用下面的代码将其转换为迭代堆栈,但这太慢了

-(void)floodFillAtPoint:(CGPoint)atPoint
 {
Stack *stack = [[Stack alloc] init];

[stack push:[StackPoint pointWithPoint:atPoint]];
StackPoint *currentPoint = nil;
int counter = 0;
while ((currentPoint = [stack pop])) 
{
    CGPoint aPoint = currentPoint.point;//CGPointMake(pointPixel.x, pointPixel.y);
    [self setColorAtPoint:aPoint];
    CGPoint bPoint = aPoint;
    bPoint.x+=1;
    if([self checkForValidRegionAtPoint:bPoint])
        [stack push:[StackPoint pointWithPoint:bPoint]];
    bPoint = aPoint;
    bPoint.x-=1;
    if([self checkForValidRegionAtPoint:bPoint])
        [stack push:[StackPoint pointWithPoint:bPoint]];
    bPoint = aPoint;
    bPoint.y+=1;
    if([self checkForValidRegionAtPoint:bPoint])
        [stack push:[StackPoint pointWithPoint:bPoint]];
    bPoint = aPoint;
    bPoint.y-=1;
    if([self checkForValidRegionAtPoint:bPoint])
        [stack push:[StackPoint pointWithPoint:bPoint]];        
    counter++;
}
[stack release];

}

有人会推荐一种在iPad设备上最有效的替代方法吗?

使用Objective-C对象来表示每个像素的速度会非常慢,而且不会带来什么好处

使用不同的数据结构来表示位图,如各种CG*位图封装机制之一。然后直接旋转位图中的位。它会越来越快。

(代表问题作者发布解决方案)\u

我终于在下面的课程中为iPhone/iPad制作了一个可接受的洪水填充。请原谅,如果有僵尸代码:)。欢迎提出改进建议

如何使用 创建CanvasView对象并设置原始图像(这应该是带有黑线的未着色/彩色图像,黑线以外的区域必须为清晰颜色),然后可以在绘制后访问图像的彩色图像

.h文件

#import <UIKit/UIKit.h>
#import "SoundEngine.h"

struct  COLOR {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char alpha;
};

typedef struct COLOR COLOR;

@interface CanvasView : UIView {
    UIImage *originalImage;
    UIImage *coloredImage;
    int selectedColor;
    BOOL shouldShowOriginalImage;

    UIImageView *imageView;
    BOOL isImageDataFreed;

    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char alpha1;
    int loopCounter;
    NSMutableArray *pixelDataArray;
    BOOL isFilling;
    BOOL hasColored;
    id delegate;
    CGPoint restartPoint;

    BOOL fillAtPoint;
    CGPoint currentTouchPoint;
    int regionCount;
    NSTimer *floadFillTimer;
}

@property (nonatomic, retain) UIImage *coloredImage;
@property (nonatomic, retain) UIImage *originalImage;
@property (nonatomic, retain) NSMutableArray *pixelDataArray;
@property (nonatomic, assign) id delegate;
@property (nonatomic, assign) BOOL shouldShowOriginalImage;
@property (nonatomic, assign) BOOL hasColored;
@property (assign) int regionCount;

-(void)toggleImage;
-(void)setColor:(int)colorIndex;
-(void)freeImageData;
-(CGColorRef)getColorForIndex:(int)index;
-(void)initializeCanvas;
-(void)prepareImageData;
-(void)setColorForColoring;
@end
StackPoint.m

    @implementation StackPoint
    @synthesize point;

    +(StackPoint*)pointWithPoint:(CGPoint)_point
    {
        StackPoint *__point = [[StackPoint alloc] init];
        __point.point = _point;
        return [__point autorelease];
    }

    -(id)init
    {
        self = [super init];
        if(self)
        {
            point = CGPointZero;
        }
        return self;
    }

    @end

可能与@quixoto重复的答案是“使用洪水填充”。我想这不是真的相关,也绝对不是重复的。@RVN,你能在这里分享代码吗?@EmptyStack:我已经用代码更新了我的问题snippet@florjan,我添加了StackPoint ClassHi@bbum:我能理解你想说的,但任何领先都会有帮助,《开发人员指南》中填充位图图像的链接或主题是计算机图形101材料。谷歌搜索将显示,文字上,10万份文件正是在讨论这个问题。还有大量的CoreGraphics教程和示例可用。从苹果提供的CoreGraphics文档开始。同意@bbum。如果您使用CG位图像素的C数组直接用ANSIC重写Objective C内容,速度可能会快得多。如果你不知道C,你就不知道Objective C。我使用了链表(Queue)和一些结构,速度大大提高了,大部分使用的内存都很低。谢谢你的帮助,我很快就会发布结果代码。大家好,我已经试过上面的代码了。这是工作良好,但我发现难以与大图像。有人能帮忙吗?
    @interface StackPoint : NSObject {
        CGPoint point;
    }

    @property (nonatomic , assign) CGPoint point;
    +(StackPoint*)pointWithPoint:(CGPoint)_point;
    @end
    @implementation StackPoint
    @synthesize point;

    +(StackPoint*)pointWithPoint:(CGPoint)_point
    {
        StackPoint *__point = [[StackPoint alloc] init];
        __point.point = _point;
        return [__point autorelease];
    }

    -(id)init
    {
        self = [super init];
        if(self)
        {
            point = CGPointZero;
        }
        return self;
    }

    @end