我在我的項目中遇到了一個奇怪的問題。我想要做的是,用戶將通過在圖像上輕掃來繪製或繪製覆蓋圖,而我只需從圖像區域下方的圖像中裁剪區域。我的代碼只有在視圖下方的UIImage
視圖寬度爲320像素(即iPhone的寬度)時才能正常工作。但如果我改變了寬度ImageView
,我沒有得到所需的結果。UIImage中的繪製區域沒有正確識別
我使用下面的代碼來構建周圍塗上部分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
),而繪畫和代表含有着色區域的矩形在其範圍內(以最小化循環)。
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其中paining完成此代碼的工作是320個像素寬,在整個屏幕寬度跨越。但是,如果圖像視圖的寬度比300更小並放置在屏幕中央,則代碼會給出錯誤結果。
注:我根據的ImageView寬度縮放圖像。
以下是在NSLog
輸出:
當的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
當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仍然無法正常工作。
圖像的大小是多少? – Wain
320×240時的ImageView寬度爲320,當ImageView的寬度是300,然後我縮放圖像爲300x225(這是ImageView的大小) –
你居然重繪圖像到大小或只是把它在圖像視圖並允許圖像視圖來縮放它? – Wain