【问题标题】:drawn area in UIImage not recognized correctlyUIImage 中的绘制区域无法正确识别
【发布时间】:2013-05-17 13:48:12
【问题描述】:

我的项目中有一个奇怪的问题。我想要做的是,用户将使用在图像上滑动作为覆盖来绘制或绘制,我只需要从绘制区域下方的图像中裁剪区域。仅当绘制区域下方的 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);
}

在上面的代码中,leftX、rightX、topY、bottomY 是浮点数中的极值(来自CGPoint),当用户在绘画时在屏幕上滑动手指时计算得出,它表示一个矩形,其中包含绘画区域bounds(最小化循环)。

    leftX   -  minimum in X-axis
    rightX  -  maximum in X-axis
    topY    -  min in Y-axis
    bottom  -  max in Y-axis 

这里的 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
    
  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
    

我该如何解决这个问题,因为我需要图像视图在中心并在其两侧进行填充。

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

【问题讨论】:

  • 图片大小是多少?
  • 320x240,当 imageview 的宽度为 320 时,当 imageview 的宽度为 300 时,我将图像缩放到 300x225(这是 imageview 的大小)
  • 您实际上是在将图像重绘到该大小还是只是将其放在图像视图中并允许图像视图对其进行缩放?
  • 我将图像缩放到 imageview 大小,然后再将其分配给 imageView。我的源图像是 320x240。如果图像视图是 320 像素宽,那么我不会对其进行缩放。如果 imageView 是 300 像素宽,那么我将图像按比例缩放到 300 宽。
  • JPEG 不支持 alpha(我认为),如果有任何提示的话。

标签: iphone ios objective-c uiimage core-image


【解决方案1】:

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

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

【讨论】:

  • 我已经在一定程度上解决了这个问题。将 malloc 更改为 calloc 后,以下链接中的方法对我有用:link
  • 但有时我的应用程序在检查像素时崩溃,我不知道原因。可能是被访问的内存位置是空的。
  • @GauravSingh 我认为您使用 CGDataProviderCopyData、CGImageGetDataProvider 和 CFDataGetBytePtr 是合适的。你现在换码了吗?如果您更新了您的问题以澄清您的问题仍然存在,这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2012-01-10
相关资源
最近更新 更多