2013-05-17 37 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是實際矩形的計算值。

正如前面表示,以及當所述的ImageView其中paining完成此代碼的工作是320個像素寬,在整個屏幕寬度跨越。但是,如果圖像視圖的寬度比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仍然無法正常工作。

+0

圖像的大小是多少? – Wain

+0

320×240時的ImageView寬度爲320,當ImageView的寬度是300,然後我縮放圖像爲300x225(這是ImageView的大小) –

+0

你居然重繪圖像到大小或只是把它在圖像視圖並允許圖像視圖來縮放它? – Wain

回答

2

首先,我想知道你是否在訪問除32位RGBA之外的東西? data []的索引值存儲在pixelInfo中,然後移動+2個字節,而不是+3。那會讓你看到藍色的字節。如果你的意圖是使用RGBA,那麼這個事實會影響你的代碼的其餘部分。

繼續前進,假設你仍然有錯誤的結果,儘管有正確的alpha分量值,看起來你的「固定」代碼會給出左側,右側,頂部,底部NSLog輸出的alpha值小於滿在255的情況下,接近0的東西。在這種情況下,沒有進一步的代碼,我建議你的問題在你用來從320x240的源代碼縮小圖像到300x225(或者任何其他縮放尺寸)的代碼中。如果您的「縮放」代碼正在執行裁剪而不是縮放,那麼我可以將您的圖像想象爲在255邊緣具有alpha值。

+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是適當的。你現在換了代碼嗎?如果你更新了你的問題來澄清你的問題仍然存在,它會有所幫助。 –