Допустим, у нас есть изображение 600X400, и мы хотим получить новое изображение 1000X100, которое содержит начальное изображение в центре и прозрачное пространство вокруг него. Как я могу достичь этого в коде?Добавить прозрачное пространство вокруг UIImage
ответ
создается новый контекст изображения, которое 1000x1000, нарисовать свой старый образ в середине, а затем получить новый UIImage
из контекста.
// Setup a new context with the correct size
CGFloat width = 1000;
CGFloat height = 1000;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);
// Now we can draw anything we want into this new context.
CGPoint origin = CGPointMake((width - oldImage.size.width)/2.0f,
(height - oldImage.size.height)/2.0f);
[oldImage drawAtPoint:origin];
// Clean up and get the new image.
UIGraphicsPopContext();
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Уважаемый DrummerB! Большое спасибо за публикацию рабочего решения. Только исправление было заменено CGPoint origin = CGRectMake ((width - oldImage.size.width)/2.0f, (height - oldImage.size.height)/2.0f); с CGPoint origin = CGPointMake ((width - oldImage.size.width)/2.0f, (высота - oldImage.size.height)/2.0f); –
@DrummerB Вы не хотите, чтобы аргумент 'opaque' в' UIGraphicsBeginImageContextWithOptions' был NO, поскольку он хочет прозрачное пространство? – Marty
В Swift вы можете написать расширение для UIImage, которое рисует изображение с вставками вокруг него.
Swift 3:
import UIKit
extension UIImage {
func imageWithInsets(insets: UIEdgeInsets) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(
CGSize(width: self.size.width + insets.left + insets.right,
height: self.size.height + insets.top + insets.bottom), false, self.scale)
let _ = UIGraphicsGetCurrentContext()
let origin = CGPoint(x: insets.left, y: insets.top)
self.draw(at: origin)
let imageWithInsets = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return imageWithInsets
}
}
OLD ОТВЕТ:
import UIKit
extension UIImage {
func imageWithInsets(insets: UIEdgeInsets) -> UIImage {
UIGraphicsBeginImageContextWithOptions(
CGSizeMake(self.size.width + insets.left + insets.right,
self.size.height + insets.top + insets.bottom), false, self.scale)
let context = UIGraphicsGetCurrentContext()
let origin = CGPoint(x: insets.left, y: insets.top)
self.drawAtPoint(origin)
let imageWithInsets = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return imageWithInsets
}
}
любая идея, почему иногда это может вернуть нуль? – Happiehappie
См. Https://developer.apple.com/reference/uikit/1623924-uigraphicsgetimagefromcurrentima: вы должны вызывать эту функцию только в том случае, когда графический контекст на основе растровых изображений является текущим графическим контекстом. Если текущий контекст равен нулю или не был создан вызовом UIGraphicsBeginImageContext (_ :), эта функция возвращает nil. – mixel
@mixel Просто небольшое предложение: оно должно быть 'return imageWithInsets? .WithRenderingMode (renderMode)' для поддержки изображений шаблонов – alexburtnik
сделать категорию на UIImage и попробовать это:
+ (UIImage *)imageWithInsets:(CGRect)insetRect image:(UIImage *)image {
CGRect newRect = CGRectMake(0.0, 0.0, insetRect.origin.x+insetRect.size.width+image.size.width, insetRect.origin.y+insetRect.size.height+image.size.height);
// Setup a new context with the correct size
UIGraphicsBeginImageContextWithOptions(newRect.size, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);
// Now we can draw anything we want into this new context.
CGPoint origin = CGPointMake(insetRect.origin.x, insetRect.origin.y);
[image drawAtPoint:origin];
// Clean up and get the new image.
UIGraphicsPopContext();
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
Это решение в Swift 4 вдохновлен DrummerB ответ:
import UIKit
extension UIImage {
func addImagePadding(x: CGFloat, y: CGFloat) -> UIImage? {
let width: CGFloat = size.width + x
let height: CGFloat = size.height + y
UIGraphicsBeginImageContextWithOptions(CGSize(width: width, height: height), false, 0)
let origin: CGPoint = CGPoint(x: (width - size.width)/2, y: (height - size.height)/2)
draw(at: origin)
let imageWithPadding = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return imageWithPadding
}
}
Как применять:
let image = UIImage(named: "your-image")!
let imageView = UIImageView(image: image.addImagePadding(x: 50, y: 50))
imageView.backgroundColor = UIColor.gray
view.addSubview(imageView)
Особенности:
- Просто передайте значение отступов с помощью параметров
- Цветных отступов (путем установки UIGraphicsBeginImageContextWithOptions opaque to false)
- 1. Как добавить прозрачное пространство вокруг gif?
- 2. Перемещение UIImage вокруг UIScrollView
- 3. Как добавить пространство вокруг границы заголовков?
- 4. Добавить пространство вокруг JPanel в JDialog?
- 5. Как добавить 10px-пространство вокруг tableViewCell?
- 6. UIBezierPath вокруг UIImage с прозрачностью
- 7. Стекло (непрозрачное/прозрачное) границы вокруг коробок?
- 8. iPhone: UITextView обертывание вокруг UIImage?
- 9. Магическое прозрачное пространство между тегами в html
- 10. дополнительное пространство вокруг контейнера
- 11. Белое пространство вокруг изображения?
- 12. Qt-пространство вокруг QWidget
- 13. Добавить границу и тень вокруг непрозрачных пикселей UIImage
- 14. Добавить UIImage поверх другого UIImage
- 15. Как удалить пространство скрытого UIImage?
- 16. Добавить прозрачное изображение в JLayeredPane
- 17. Добавить пространство вокруг каждого/с использованием HUMANIZER или Regex
- 18. Как добавить дополнительное пространство вокруг меток оси на QwtPlot?
- 19. Как добавить пространство вокруг удаленных тегов в BeautifulSoup
- 20. Удалить белое пространство вокруг ToolStripControlHost
- 21. пространство вокруг div с фоном
- 22. Белое пространство вокруг фона-изображения
- 23. Нежелательное пространство вокруг пользовательских шрифтов
- 24. пространство вокруг поиска LIKE MySQL
- 25. Удалить дополнительное пространство вокруг QLabel
- 26. UIImage обрезка белых областей вокруг круга IOS
- 27. Верхняя и нижняя граница вокруг UIImage
- 28. Есть ли способ игнорировать прозрачное пространство SVG-файла?
- 29. Пространство вокруг кнопки радио на большой
- 30. Добавить границу в не-квадратный UIImage
Не должно быть закрыто ИМО. Вопрос хорошо определен и полезен. – sjwarner