2013-05-17 45 views
10

Tôi gặp sự cố lạ trong dự án của mình. Những gì tôi muốn làm là, người dùng sẽ vẽ hoặc vẽ bằng cách vuốt qua một hình ảnh dưới dạng lớp phủ và tôi chỉ cần cắt khu vực từ hình ảnh bên dưới vùng được vẽ. Mã của tôi chỉ hoạt động tốt khi chế độ xem UIImage nằm dưới vùng sơn rộng 320 pixel, tức là chiều rộng của iPhone. Nhưng nếu tôi thay đổi chiều rộng của ImageView, tôi không nhận được kết quả mong muốn.khu vực được vẽ trong UIImage không được nhận dạng chính xác

Tôi đang sử dụng mã sau để tạo một CGRect xung quanh phần được sơn.

-(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); 
} 

Trong mã leftX trên, rightX, Topy, bottomY là những giá trị cực đoan (từ CGPoint) trong phao mà được tính khi người dùng swipe ngón tay của họ trên màn hình trong khi sơn và đại diện cho một hình chữ nhật, trong đó có khu vực sơn trong giới hạn của nó (để giảm thiểu vòng lặp).

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

Ở đây l, r, t, b là các giá trị được tính cho hình chữ nhật thực.

Như đã trình bày ở trên, mã này hoạt động tốt khi các lần xem hình ảnh được thực hiện rộng 320 pixel và được trải rộng trên toàn màn hình. Nhưng nếu chiều rộng của hình ảnh thu nhỏ hơn 300 và được đặt ở giữa màn hình, mã sẽ cho kết quả sai.

Lưu ý: Tôi đang chia tỷ lệ hình ảnh theo chiều rộng của hình ảnh.

Dưới đây là những NSLog đầu ra:

  1. Khi chiều rộng ImageView là 320 pixel (Đây là những giá trị cho các thành phần của màu tại điểm ảnh phù hợp hoặc điểm ảnh không trong suốt):

    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. Khi chiều rộng của imageview là 300 pixel:

    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 
    

Làm cách nào tôi có thể giải quyết vấn đề này vì tôi cần số lần xem ảnh ở giữa với phần đệm ở cả hai bên.

EDIT: Ok có vẻ như vấn đề của tôi là do định hướng hình ảnh của hình ảnh JPEG (từ máy ảnh). Hình ảnh Png hoạt động tốt và không bị ảnh hưởng bởi thay đổi về chiều rộng của imageview. Nhưng vẫn ảnh JPEG không hoạt động ngay cả khi tôi đang xử lý hướng.

+0

Kích thước hình ảnh là gì? – Wain

+0

320x240 khi chiều rộng của imageview là 320 và khi chiều rộng của số lần xem là 300 thì khi đó tôi đang chia tỷ lệ hình ảnh thành 300x225 (kích thước của hình ảnh) –

+0

Bạn có thực sự vẽ lại hình ảnh ở kích thước đó hay chỉ đặt nó ở chế độ xem hình ảnh và cho phép xem hình ảnh để mở rộng nó? – Wain

Trả lời

2

Trước tiên, tôi tự hỏi bạn có đang truy cập thứ gì khác ngoài RGBA 32 bit không? Giá trị chỉ mục cho dữ liệu [] được lưu trữ trong pixelInfo sau đó di chuyển +2 byte, thay vì +3. Điều đó sẽ hạ cánh bạn trên byte màu xanh. Nếu ý định của bạn là sử dụng RGBA, thực tế đó sẽ ảnh hưởng đến phần còn lại của kết quả mã của bạn. Di chuyển trên, với giả định rằng bạn vẫn nhận được kết quả thiếu sót mặc dù có giá trị thành phần alpha chính xác, có vẻ như mã "cố định" của bạn sẽ cung cấp các kết quả đầu ra NSLog Trái, Phải, Trên, Dưới với giá trị alpha nhỏ hơn toàn bộ Trong trường hợp này, không có mã nào khác, tôi đề nghị vấn đề của bạn nằm trong mã bạn sử dụng để chia tỷ lệ hình ảnh từ nguồn 320x240 thành 300x225 (hoặc có thể là bất kỳ kích thước được chia tỷ lệ nào khác). Tôi có thể tưởng tượng hình ảnh của bạn có giá trị alpha ở cạnh 255 nếu mã "tỷ lệ" của bạn đang thực hiện một vụ cắt thay vì tỷ lệ.

+0

Tôi đã giải quyết được vấn đề. Các phương pháp trong liên kết dưới đây sau khi thay đổi malloc để calloc đang làm việc cho tôi: [link] (http://stackoverflow.com/questions/448125/how-to-get-pixel-data-from-a-uiimage-cocoa- touch-or-cgimage-core-graphics) –

+0

Nhưng đôi khi ứng dụng của tôi gặp sự cố khi kiểm tra pixel và tôi không biết lý do. Có thể là vị trí bộ nhớ đang được truy cập trống. –

+0

@GauravSingh Tôi nghĩ rằng bạn sử dụng CGDataProviderCopyData, CGImageGetDataProvider và CFDataGetBytePtr là phù hợp. Bạn đã chuyển mã ngay bây giờ chưa? Nó sẽ giúp nếu bạn cập nhật câu hỏi của bạn để làm rõ vấn đề của bạn vẫn còn là gì. –

Các vấn đề liên quan