Iphone iPad中的洪水填充速度太慢
我在iPad上的一个着色应用程序中使用flood Filling 该应用程序基本上填充了图像黑线内的颜色,我可以毫无问题地完成这项工作,但速度太慢了 我首先使用了递归泛洪填充,它的性能是最差的(由于堆栈溢出),然后我可以使用下面的代码将其转换为迭代堆栈,但这太慢了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
-(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