2016-04-30 6 views
1

私はUIImageUIGraphicsBeginImageContext drawInRect不正確

if (actualHeight > maxHeight || actualWidth > maxWidth) 
    { 
     if(imgRatio < maxRatio) 
     { 
      //adjust width according to maxHeight 
      imgRatio = maxHeight/actualHeight; 
      actualWidth = imgRatio * actualWidth; 
      actualHeight = maxHeight; 
     } 
     else if(imgRatio > maxRatio) 
     { 
      //adjust height according to maxWidth 
      imgRatio = maxWidth/actualWidth; 
      actualHeight = imgRatio * actualHeight; 
      actualWidth = maxWidth; 
     } 
     else 
     { 
      actualHeight = maxHeight; 
      actualWidth = maxWidth; 
     } 
    } 
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight); 
    UIGraphicsBeginImageContext(rect.size); 
    [image drawInRect:rect]; 
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
    NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality); 
    UIGraphicsEndImageContext(); 

を圧縮するために、このメソッドを使用しています。しかし、いくつかUIImageのために、それらのの下部に、1つのピクセル白い線があります。 何が原因であるかに関するご意見はありますか? ありがとうございました!

答えて

2

問題は、CGFloatsを使用していて、それらを乗算/除算しているため、非整数座標になります。

ライン

actualWidth = imgRatio * actualWidth; 

actualHeight = imgRatio * actualHeight; 

非整数座標を引き起こす可能性があります。これを解決するには、ceilfまたはfloorfまたはroundfを使用してください。例えば。何が起こる

actualWidth = ceilf(imgRatio * actualWidth); 
actualHeight = ceilf(imgRatio * actualHeight); 

せず、それ

CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight); 

実際かもしれ(0,0,24.33, 24.33) あなたが実際にこのサイズの矩形を描画することができるが、画像は高さと幅のための画素 ラウンド数を持っている必要があり、アップルはおそらくイメージコンテクストを作成するために矩形を丸めます。

しかし、おそらくそれらはアンチエイリアス処理を使用して描画するので、実際には視覚的には非整数ピクセルのように見えます。だからこそ、あなたは白い線とおそらく品質の低下を受けるのです。

+0

詳細な対応をありがとうございます。私はその行動を疑った、私はそれをチェックするために私のコンピュータの近くにいない!もし私ができるのであれば、ちょっとした質問です:一般的には、(100.56,34.6)のように、プライマリナンバーではなく、サラウンドを描くことは可能ですか?または、Apple APIが自動的にラウンドします(この場合、解決策はありません)。どうもありがとうございます! –

+0

ceilを追加すると、問題は解決しました。どうもありがとうございます! –

+0

このように描画しても、デバイスに表示する方法はありません。デバイスができる最良のことは、画像全体をアンチエイリアスすることです。これは、それを非常にぼやけにします。あなたはそれを望んでいません。 – Alistra