2013-01-02 49 views
1

我試圖給UIImage添加一個文本,我得到了一個像素化的繪圖。CGContextShowTextAtPoint在Retina設備上產生非Retina輸出

我已經嘗試了一些其他的答案,但沒有成功:

我的代碼:

-(UIImage *)addText:(UIImage *)imgV text:(NSString *)text1 
{ 
    int w = self.frame.size.width * 2; 
    int h = self.frame.size.height * 2; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate 
     (NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); 

    CGContextDrawImage(context, CGRectMake(0, 0, w, h), imgV.CGImage);  
    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1); 

    char* text = (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding]; 
    CGContextSelectFont(context, "Arial", 24, kCGEncodingMacRoman); 

    // Adjust text; 

    CGContextSetTextDrawingMode(context, kCGTextInvisible); 
    CGContextShowTextAtPoint(context, 0, 0, text, strlen(text)); 

    CGPoint pt = CGContextGetTextPosition(context); 
    float posx = (w/2 - pt.x)/2.0; 
    float posy = 54.0;  
    CGContextSetTextDrawingMode(context, kCGTextFill); 
    CGContextSetRGBFillColor(context, 255, 255, 255, 1.0); 

    CGContextShowTextAtPoint(context, posx, posy, text, strlen(text)); 

    CGImageRef imageMasked = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    return [UIImage imageWithCGImage:imageMasked]; 
} 

example of jagged image

+2

你有沒有考慮過使用'UIGraphicsBeginImageContextWithOptions'和相關函數呢? –

+0

是的,但文字的邊緣保持鋸齒狀。 – ppaulojr

+0

您爲比例因子傳遞了哪個值?另外,請編輯您的問題,以包含「像素化」,「鋸齒狀」文本的屏幕截圖。 –

回答

5

像彼得說的那樣,用UIGraphicsBeginImageContextWithOptions。您可能想要將image.scale傳遞給scale屬性(其中image.scale是您正在繪製的某個圖像的比例),或者僅使用[UIScreen mainScreen] .scale。

該代碼可以做得更簡單整體。嘗試類似:

// Create the image context 
UIGraphicsBeginImageContextWithOptions(_baseImage.size, NO, _baseImage.scale); 

// Draw the image 
CGRect rect = CGRectMake(0, 0, _baseImage.size.width, _baseImage.size.height); 
[_baseImage drawInRect:rect]; 

// Get a vertically centered rect for the text drawing 
rect.origin.y = (rect.size.height - FONT_SIZE)/2 - 2; 
rect = CGRectIntegral(rect); 
rect.size.height = FONT_SIZE; 

// Draw the text 
UIFont *font = [UIFont boldSystemFontOfSize:FONT_SIZE]; 
[[UIColor whiteColor] set]; 
[text drawInRect:rect withFont:font lineBreakMode:NSLineBreakByClipping alignment:NSTextAlignmentCenter]; 

// Get and return the new image 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return image; 

其中text是一個NSString對象。

+0

謝謝@fnf ..它爲我工作.. – user2534255

0

我當時面對的是同樣的問題,昨晚發佈了一個問題,沒人回答。我在以下問題中將fnf的建議更改與Clif Viegas的回答結合在一起: CGContextDrawImage draws image upside down when passed UIImage.CGImage

想出解決方案。我的方法addText從你的稍有不同:

+(的UIImage *)addTextToImage:(的UIImage *)IMG文本:(的NSString *)的text1 {

int w = img.size.width; 
int h = img.size.height; 

CGSize size = CGSizeMake(w, h); 
if (UIGraphicsBeginImageContextWithOptions != NULL) { 
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); 
} else { 
    UIGraphicsBeginImageContext(size); 
} 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 


CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(context, 0,h); 
CGContextScaleCTM(context, 1.0, -1.0); 

CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage); 

CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1); 

char* text = (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding];// \"05/05/09\"; 

CGContextSelectFont(context, "Times New Roman", 14, kCGEncodingMacRoman); 
CGContextSetTextDrawingMode(context, kCGTextFill); 

CGContextSetRGBFillColor(context, 0, 0, 0, 1); 

//rotate text 

CGContextSetTextMatrix(context, CGAffineTransformMakeRotation(-M_PI/8)); 

CGContextShowTextAtPoint(context, 70, 88, text, strlen(text)); 

CGColorSpaceRelease(colorSpace); 

UIGraphicsEndImageContext();
return newImg;

}

總之,我所做的就是添加

if (UIGraphicsBeginImageContextWithOptions != NULL) { 
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); 
} else { 
    UIGraphicsBeginImageContext(size); 
} 

刪除

// CGContextRef上下文= CGBitmapContextCreate(NULL,W,H,8,4 *寬,色彩空間,kCGImageAlphaPremultipliedFirst);

,並把

CGContextRef context = UIGraphicsGetCurrentContext(); 

代替。但是這會導致圖像顛倒。因此,我把

CGContextTranslateCTM(context, 0,h); 
CGContextScaleCTM(context, 1.0, -1.0); 

之前 CGContextDrawImage(上下文,CGRectMake(0,0,W,H),img.CGImage);

這樣你可以使用CG函數來代替使用drawInRect等。

末不要忘記

UIGraphicsEndImageContext

。希望這可以幫助。