从char *数组到二维数组和返回算法出错了

时间:2011-09-12 13:20:53

标签: objective-c c algorithm

我认为我的算法在某处有错误的逻辑。调用这两个函数应该返回相同的图像,但它不会!任何人都可以看到我的逻辑出错了吗?

这些功能用于PNG图像,我发现它们存储的颜色如下:ALPHA,RED,GREEN,BLUE。重复整个图像。 “像素”只是这些值的一长串(如列表)。

我的意图是在图像上做一个低通滤波器,如果您改为使用图像的二维数组/矩阵,那么逻辑就会容易得多。

// loading pixels
UIImage *image      = imageView.image;
CGImageRef imageRef = image.CGImage;
NSData *data        = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
char *pixels        = (char *)[data bytes];

// editing image
char** matrix = [self mallocMatrix:pixels withWidth:CGImageGetWidth(imageRef) andHeight:CGImageGetHeight(imageRef)];
char* newPixels = [self mallocMatrixToList:matrix withWidth:CGImageGetWidth(imageRef) andHeight:CGImageGetHeight(imageRef)];
pixels = newPixels;

并且函数看起来像这样:

- (char**)mallocMatrix:(char*)pixels withWidth:(int)width andHeight:(int)height {
    char** matrix = malloc(sizeof(char*)*height);
    int c = 0;
    for (int h=0; h < height; h++) {
        matrix[h] = malloc(sizeof(char)*width*4);
        for (int w=0; w < (width*4); w++) {
            matrix[h][w] = pixels[c];
            c++;
        }
    }
    return matrix;
}

- (char*)mallocMatrixToList:(char**)matrix withWidth:(int)width andHeight:(int)height {
    char* pixels = malloc(sizeof(char)*height*width*4);
    int c = 0;
    for (int h=0; h < height; h++) {
        for (int w=0; w < (width*4); w++) {
            pixels[c] = matrix[h][w];
            c++;
        }
    }
    return pixels;
}

编辑:修正了指向海报的malloc。稍微简化了算法。

1 个答案:

答案 0 :(得分:1)

我还没有测试过您的代码,但看起来您正在为矩阵和低通滤波器分配不正确的大小,而不是正确地移动到下一个像素。

- (char**) mallocMatrix:(char*)pixels withWidth:(int)width andHeight:(int)height {
    //When using Objective-C do not cast malloc (only do so with Objective-C++)
    char** matrix = malloc(sizeof(char*)*height);
    for (int h=0; h < height; h++) {
        //Each row needs to malloc the sizeof(char) not char *
        matrix[h] = malloc(sizeof(char)*width*4);
        for (int w=0; w < width; w++) {
            // Varje pixel har ARGB
            for (int i=0; i < 4; i++) {
                matrix[h][w+i] = pixels[h*w+i];
            }
        }
    }
    return matrix;
}

- (char*) mallocLowPassFilter:(char**)matrix withWidth:(int)width andHeight:(int)height 
{
    //Same as before only malloc sizeof(char)
    char* pixels = malloc(sizeof(char)*height*width*4);
    for (int h=0; h < height; h++) {
        for (int w=0; w < width; w++) {
            // Varje pixel har ARGB
            for (int i=0; i < 4; i++) {
                // TODO: Lowpass here
                pixels[h*w+i] = matrix[h][w+i];
            }
        }
    }
    return pixels;
}

注意:如您所知,此代码仅限于ARGB图像。如果您想支持更多图像格式,可以使用其他函数来获取有关图像的更多信息,例如CGImageGetColorSpace以查找像素格式(ARGB,RGBA,RGB等)和{{3获取每行的字节数(不必将每个像素的宽度乘以宽度)。