gpt4 book ai didi

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

转载 作者:技术小花猫 更新时间:2023-10-29 11:07:38 26 4
gpt4 key购买 nike

我的项目中遇到了一个奇怪的问题。我想要做的是,用户将使用在图像上滑 Action 为覆盖来绘制或绘制,我只需要从绘制区域下方的图像中裁剪区域。仅当绘图区域下方的 UIImage View 为 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 是 float 中的极值(来自 CGPoint),当用户在绘画时在屏幕上滑动手指时计算并代表一个矩形,其中包含边界内的绘制区域(以最小化循环)。

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

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

如前所述,当完成绘制的 ImageView 为 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

我该如何解决这个问题,因为我需要 ImageView 居中,两边都有填充。

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

最佳答案

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

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

关于iphone - UIImage 中的绘制区域无法正确识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16610701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com