2015-04-20 2 views
5

Я использую вид изображения:Поворот изображения искажается и размывается?

@IBOutlet weak var imageView: UIImageView! 

окрасить изображение, а также другое изображение, которое было повернуто. Оказывается, что повернутое изображение имеет очень плохое качество. На следующем изображении очки в желтой коробке не вращаются. Очки в красной коробке повернуты на 4.39 градуса.

enter image description here

Вот код я использую, чтобы сделать очки:

UIGraphicsBeginImageContext(imageView.image!.size) 
    imageView.image!.drawInRect(CGRectMake(0, 0, imageView.image!.size.width, imageView.image!.size.height)) 

var drawCtxt = UIGraphicsGetCurrentContext() 

var glassImage = UIImage(named: "glasses.png") 
let yellowRect = CGRect(...) 

CGContextSetStrokeColorWithColor(drawCtxt, UIColor.yellowColor().CGColor) 
CGContextStrokeRect(drawCtxt, yellowRect) 
CGContextDrawImage(drawCtxt, yellowRect, glassImage!.CGImage) 

// paint the rotated glasses in the red square 
CGContextSaveGState(drawCtxt) 
CGContextTranslateCTM(drawCtxt, centerX, centerY) 
CGContextRotateCTM(drawCtxt, 4.398 * CGFloat(M_PI)/180) 
var newRect = yellowRect 
newRect.origin.x = -newRect.size.width/2 
newRect.origin.y = -newRect.size.height/2 
CGContextAddRect(drawCtxt, newRect) 
CGContextSetStrokeColorWithColor(drawCtxt, UIColor.redColor().CGColor) 
CGContextSetLineWidth(drawCtxt, 1) 

// draw the red rect 
CGContextStrokeRect(drawCtxt, newRect) 
// draw the image 
CGContextDrawImage(drawCtxt, newRect, glassImage!.CGImage) 
CGContextRestoreGState(drawCtxt) 

Как можно вращать и рисовать очки без потери качества или получить искаженное изображение?

+0

Помогает ли вам создать контекст с помощью 'UIGraphicsBeginImageContextWithOptions (..., 0.0)', чтобы получить контекст чертежа, который использует тот же масштабный коэффициент, что и ваше устройство? –

+0

@MartinR, размер которого я должен использовать для создания контекста? –

ответ

3

Чтобы создать исходный контекст, вы должны использовать UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale). Передача в 0.0, так как scale по умолчанию будет масштабироваться по текущему экрану (например, 2.0 на iPhone 6 и 3.0 на iPhone 6 Plus).

Смотрите эту ноту на UIGraphicsBeginImageContext():

Эта функция эквивалентна вызову функции UIGraphicsBeginImageContextWithOptions с непрозрачной параметром, установленным на NO и масштабным коэффициентом 1,0.

+0

Что делает параметр '' opaque''? Я не видел никакой разницы. –

+1

Документы: «Если вы знаете, что битмап полностью непрозрачен, укажите« YES », чтобы игнорировать альфа-канал и оптимизировать хранилище растрового изображения. Указание« НЕТ »означает, что растровое изображение должно включать альфа-канал для обработки частично прозрачных пикселей». – jszumski

1

Как указывали другие, вам необходимо настроить свой контекст, чтобы можно было отображать сетчатки.

Кроме этого, вы можете использовать исходное изображение, размер которого больше целевого размера дисплея и масштабировать его. (2X пиксельные размеры целевого изображения были бы хорошим местом для начала.)

Вращение на нечетные углы разрушительно. Графический движок должен отображать сетку исходных пикселей на другую сетку, где они не выстраиваются в линию. Совершенно прямые линии в исходном изображении больше не являются прямыми в целевом изображении и т. Д. Графический движок должен выполнять некоторую интерполяцию, а исходный пиксель может быть распределен по нескольким пикселям или меньше, чем полный пиксель, в целевом изображении.

Предоставляя изображение большего размера, вы даете графический движок больше информации для работы. Он может лучше срезать и вырезать эти исходные пиксели в сетку назначения пикселей.

Смежные вопросы