UIImage中的绘制区域无法正确识别

Gau*_*ngh 10 iphone objective-c core-image uiimage ios

我的项目中有一个奇怪的问题.我想要做的是,用户将使用在图像上滑动作为叠加来绘制或绘制,我只需要从绘制区域下方的图像中裁剪区域.只有当UIImage油漆区域下方的视图宽度为320像素(即iPhone的宽度)时,我的代码才能正常工作.但如果我改变了宽度ImageView,我没有得到理想的结果.

我使用以下代码构建一个CGRect绘制的部分.

-(CGRect)detectRectForFaceInImage:(UIImage *)image{
    int l,r,t,b;
    l = r = t = b = 0;

    CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
    const UInt8* data = CFDataGetBytePtr(pixelData);

    BOOL pixelFound = NO;

    for (int i = leftX ; i < rightX; i++) {
        for (int j = topY; j < bottomY + 20; j++) {
            int pixelInfo = ((image.size.width  * j) + i ) * 4;
            UInt8 alpha = data[pixelInfo + 2];
            if (alpha) {
                NSLog(@"Left %d", alpha);
                l = i;
                pixelFound = YES;
                break;
            }
        }
        if(pixelFound) break;
    }

    pixelFound = NO;
    for (int i =  rightX ; i >= l; i--) {
        for (int j = topY; j < bottomY ; j++) {
            int pixelInfo = ((image.size.width  * j) + i ) * 4;
            UInt8 alpha = data[pixelInfo + 2];
            if (alpha) {
                NSLog(@"Right %d", alpha);
                r = i;
                pixelFound = YES;
                break;
            }
        }
        if(pixelFound) break;
    }

    pixelFound = NO;
    for (int i = topY ; i < bottomY ; i++) {
        for (int j = l; j < r; j++) {
            int pixelInfo = ((image.size.width  * i) + j ) * 4;
            UInt8 alpha = data[pixelInfo + 2];
            if (alpha) {
                NSLog(@"Top %d", alpha);
                t = i;
                pixelFound = YES;
                break;
            }
        }
        if(pixelFound) break;
    }

    pixelFound = NO;
    for (int i = bottomY ; i >= t; i--) {
        for (int j = l; j < r; j++) {
            int pixelInfo = ((image.size.width  * i) + j ) * 4;
            UInt8 alpha = data[pixelInfo + 2];
            if (alpha) {
                NSLog(@"Bottom %d", alpha);
                b = i;
                pixelFound = YES;
                break;
            }
        }
        if(pixelFound) break;
    }

    CFRelease(pixelData);


    return CGRectMake(l, t, r - l, b-t);
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,leftX,rightX,topY,bottomY是float中的极值(from CGPoint),当用户在绘画时在屏幕上滑动手指并且表示包含其边界中绘制区域的矩形时(最小化循环) ).

    leftX   -  minimum in X-axis
    rightX  -  maximum in X-axis
    topY    -  min in Y-axis
    bottom  -  max in Y-axis 
Run Code Online (Sandbox Code Playgroud)

这里l,r,t,b是实际矩形的计算值.

如前所述,当完成绘画的图像视图宽320像素并跨越整个屏幕宽度时,此代码可以很好地工作.但是如果imageview的宽度小于300并且放置在屏幕的中心,则代码会给出错误的结果.

注意:我根据imageview的宽度缩放图像.

以下是NSLog输出:

  1. 当imageview的宽度为320像素时(这些是匹配像素或非透明像素的颜色分量的值):

    2013-05-17 17:58:17.170 FunFace[12103:907] Left 41
    2013-05-17 17:58:17.172 FunFace[12103:907] Right 1
    2013-05-17 17:58:17.173 FunFace[12103:907] Top 73
    2013-05-17 17:58:17.174 FunFace[12103:907] Bottom 12
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当imageview的宽度为300像素时:

    2013-05-17 17:55:26.066 FunFace[12086:907] Left 42
    2013-05-17 17:55:26.067 FunFace[12086:907] Right 255
    2013-05-17 17:55:26.069 FunFace[12086:907] Top 42
    2013-05-17 17:55:26.071 FunFace[12086:907] Bottom 255
    
    Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题,因为我需要在中心使用带有填充的imageview.

编辑:好看,我的问题是由于JPEG图像(来自相机)的图像方向.Png图像效果很好,不受imageview宽度变化的影响.但即使我正在处理方向,JPEG仍无法正常工作.

Tom*_*ace 2

首先,我想知道您是否正在访问 32 位 RGBA 以外的其他内容?data[] 的索引值存储在 PixelInfo 中,然后移动 +2 个字节,而不是 +3 个字节。那会让你进入蓝色字节。如果您的意图是使用 RGBA,那么这一事实将影响代码的其余结果。

继续,假设尽管具有正确的 alpha 分量值,但您仍然得到有缺陷的结果,似乎您的“固定”代码会给出 Left、Right、Top、Bottom NSLog 输出,其 alpha 值小于完整的 255,接近 0 的值。在这种情况下,如果没有进一步的代码,我建议您的问题出在您用于将图像从 320x240 源缩小到 300x225(或可能任何其他缩放尺寸)的代码中。如果您的“缩放”代码执行的是裁剪而不是缩放,我可以想象您的图像的 alpha 值在 255 的边缘。