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:
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
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.
Kích thước hình ảnh là gì? – Wain
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) –
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