У меня возникла странная проблема в моем проекте. Я хочу, чтобы пользователь рисовал или рисовал, используя салфетки над изображением в качестве наложения, и мне просто нужно обрезать область из изображения, расположенного ниже окрашенной области. Мой код работает хорошо, только когда вид 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 - вычисленные значения для фактического прямоугольника.
Как уже говорилось выше, этот код хорошо работает, когда изображение, в котором выполняется обработка, составляет 320 пикселей в ширину и распространяется по ширине экрана. Но если ширина изображения будет меньше 300 и будет помещена в центр экрана, код даст ложный результат.
Примечание: Я масштабирую изображение в соответствии с шириной изображения.
Ниже приведен 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
Когда ширина изображения составляет 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
Как решить эту проблему, потому что мне нужно изображение в центре с отступом на обе стороны.
EDIT: ОК, похоже, моя проблема связана с ориентацией изображения изображений JPEG (с камеры). Изображения Png работают хорошо и не меняются при изменении ширины изображения. Но все же JPEG не работают, даже если я обрабатываю ориентацию.
Каков размер изображения? – Wain
320x240, когда ширина изображения равна 320, а когда ширина изображения равна 300, я масштабирую изображение до 300x225 (это размер изображения). –
Вы действительно перерисовываете изображение до этого размера или просто помещаете его в изображение? и позволяет просматривать изображение? – Wain