2013-05-17 2 views
10

У меня возникла странная проблема в моем проекте. Я хочу, чтобы пользователь рисовал или рисовал, используя салфетки над изображением в качестве наложения, и мне просто нужно обрезать область из изображения, расположенного ниже окрашенной области. Мой код работает хорошо, только когда вид 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 выхода:

  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. Когда ширина изображения составляет 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 не работают, даже если я обрабатываю ориентацию.

+0

Каков размер изображения? – Wain

+0

320x240, когда ширина изображения равна 320, а когда ширина изображения равна 300, я масштабирую изображение до 300x225 (это размер изображения). –

+0

Вы действительно перерисовываете изображение до этого размера или просто помещаете его в изображение? и позволяет просматривать изображение? – Wain

ответ

2

Во-первых, интересно, имеете ли вы доступ к чему-то, кроме 32-битного RGBA? Значение индекса для данных [] сохраняется в pixelInfo, а затем перемещает +2 байта, а не +3. Это вывело бы вас на синий байт. Если вы намерены использовать RGBA, этот факт повлияет на остальные результаты вашего кода.

Продолжая работу с допущением, что вы все еще получаете недостатки, несмотря на то, что у вас есть правильное значение альфа-компонента, кажется, что ваш «фиксированный» код даст Left, Right, Top, Bottom NSLog выходы с альфа-значениями меньше, чем полный -в 255, что-то близкое к 0. В этом случае, без дальнейшего кода, я бы предположил, что ваша проблема находится в коде, который вы используете для масштабирования изображения с вашего источника 320x240 до 300x225 (или, возможно, любых других масштабированных измерений). Я мог представить, что ваше изображение имеет альфа-значения на границе 255, если ваш «масштабный» код выполняет урожай, а не масштаб.

+0

У меня есть несколько проблем. Метод в приведенной ниже ссылке после изменения malloc на calloc работает для меня: [link] (http://stackoverflow.com/questions/448125/how-to-get-pixel-data-from-a-uiimage-cocoa- touch-or-cgimage-core-graphics) –

+0

Но иногда мое приложение падает при проверке пикселей, и я не знаю причины. Может быть, доступ к ячейке памяти пуст. –

+0

@GauravSingh Я думаю, что ваше использование CGDataProviderCopyData, CGImageGetDataProvider и CFDataGetBytePtr является подходящим. Вы теперь переключили код? Это поможет, если вы обновите свой вопрос, чтобы выяснить, какова ваша проблема. –

Смежные вопросы