Вы можете проверить цвет в пикселях (0,0) .Это будет цвет рамки.Затем вы бы опустились на 1 пиксель вниз и на 1 пиксель влево, пока не получите другой цвет - вот как вы находите толщину рамки.
Примерно так:
self.yourImage = [UIImage imageNamed:@"painting-with-border.png"];
NSLog(@"original size: %@", NSStringFromCGSize(self.yourImage.size));
BOOL success = NO;
CGFloat x_frame = 1.0;
CGFloat y_frame = 1.0;
CGFloat x_max = self.yourImage.size.width/2.0;
CGFloat y_max = self.yourImage.size.height/2.0;
UIColor *frameColor = [self.yourImage colorAtPixel: CGPointMake (1.0,1.0)];
NSString *hexFrameColor = [frameColor hexStringFromColor];
NSLog (@"frame color: %@", hexFrameColor);
UIColor *testPixelColor;
NSString *hexTestPixelColor;
while ((!success) && (x_frame < x_max) && (y_frame < y_max)) {
x_frame = x_frame + 1.0;
y_frame = y_frame + 1.0;
testPixelColor = [self.yourImage colorAtPixel: CGPointMake (x_frame,y_frame)];
hexTestPixelColor = [testPixelColor hexStringFromColor];
NSLog(@"color at pixel (%.0f,%.0f): %@", x_frame,y_frame,hexTestPixelColor);
if (![hexFrameColor isEqualToString: hexTestPixelColor]) {
success = YES;
NSLog (@"found frame border at (%.0f,%.0f)", x_frame,y_frame);
}
}
CGRect newFrame;
if (success) {
newFrame = CGRectMake(x_frame,y_frame,self.yourImage.size.width-x_frame,self.yourImage.size.height-y_frame);
NSLog(@"To crop image inside frame use: %@", NSStringFromCGRect(newFrame));
} else {
NSLog (@"couldn't define frame width");
}
Этот метод проверяет изображение на наличие рамки.к середине изображения.
Примечание:
ColorAtPixel
не является частью UIKit
.Вы можете получить его в OBShapedButton Оле Бегеманна .
hexStringFromColor
не является частью UIKit
.Эту категорию вы можете найти в uicolor-utilities .
Для обрезки UIImage
вы можете найти много способов здесь, на SO, но это не является частью вашего вопроса.
Этот код был протестирован с изображением:
Вывод был:
оригинальный размер: {314, 451}
цвет рамки: 980C0C
цвет в пикселе (2,2): 980C0C
цвет в пикселе (3,3): 980C0C
цвет в пикселе (4,4): 980C0C
цвет в пикселе (5,5): 980C0C
цвет в пикселе (6,6): 414429
найдена граница рамки в (6,6)
Чтобы обрезать изображение внутри фрейма, используйте: {{6, 6}, {308, 445}}
ПРИМЕЧАНИЕ: этот метод будет работать только в том случае, если рамка выполнена из точно такого же цвета,Некоторые границы в (сжатых) .jpg
изображениях могут иметь границы, где цвет слегка меняется.Для этого вам следует использовать алгоритм, который проверяет сходство цветов - но это совершенно другая тема.
Также этот код написан для изображений с одинаковой толщиной рамки со всех сторон.Я уверен, что вы сможете изменить код для случаев, когда толщина рамки сверху / снизу отличается от толщины слева / справа.