2011-01-12 2 views
1

Я пытаюсь добавить NSString в NSImage в своем приложении. По какой-то причине это кажется чрезвычайно размытым и шумным. Вот результат, который сохраняется как jpeg.NSString drawAtPoint - blurry

http://i.stack.imgur.com/QHVQF.jpg

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

Вот как я добавить текст:

[generatedRectangle lockFocus]; 
//Draw according to the settings 
[color set]; 
NSRectFill(NSMakeRect(0, 0, sizeX, sizeY)); 


NSPoint p = NSMakePoint(round(sizeX/2), round(sizeY/2)); 

[text drawAtPoint:p withAttributes:NULL]; 

Затем я сохранить его, захватив его с NSBitmapImageRep и передать его на панель сохранения. я на самом деле записать файл с помощью следующей команды:

[[generatedRect representationUsingType: NSJPEGFileType properties: nil] 
    writeToFile:[save filename] atomically: YES]) 

Любые идеи о том, почему текст настолько размыто? У меня закончились идеи немного назад.

Вся помощь с благодарностью.

+0

Я пытаюсь в реализации кода, что является объектом generatedRectangle, NSView? Не следует ли рисовать в методе drawRect:? –

+0

СгенерированныйRectangle - это NSImage. Извините за путаницу. – mbseid

ответ

8

Помните, что кварц использует границы среднего пикселя, поэтому вам может понадобиться убедиться, что ваша координата -drawAtPoint:withAttributes: не является интегральной, но смещена на половину пикселя в X и Y (например: 10,5, 10,5 вместо 10,0, 10,0).

Кроме того, убедитесь, что представления в вашей иерархии, вытягиваемой из всех, имеют свое происхождение на интегральных границах пикселей. Даже один просмотр вашего представления текстового чертежа может привести к размытому рендерингу. Возможно, вы сможете использовать опцию Color Misaligned Layers инструмента Core Animation, чтобы отслеживать это, если эти представления поддерживаются с помощью слоя.

2

Это выглядит как чрезмерное сжатие JPEG. Вы можете указать степень сжатия по свойству NSImageCompressionFactor. Чтобы сделать сжатие, установите его на [NSNumber numberWithFloat:1.0].

15

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

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0f); 

Если вы используете UIGraphicsBeginImageContext(<#CGSize size#>) то, что является IOS 4.0 и ниже API, так это» сделайте это так, как будто вы не на экране сетчатки.

2

Только что эта проблема. Это все, что вам нужно:

CGContextSetShouldAntialias(yourcontext, true);