2015-09-01 74 views
4

我正在構建自定義圖像鍵盤,並且無法正確調整圖像大小。我嘗試了一堆不同的方法,但沒有成功。問題是,圖像要麼比我想要的要大,要麼將其調整到我的預期尺寸的一半,然後比原來的圖像更模糊。在下面的示例中,我試圖將圖像的大小調整爲與屏幕上顯示的大小相同(請參閱底部的屏幕截圖)。這裏是我的調用調整大小代碼:UIImage縮小規模 - 分辨率損失

println("Starting Size is \(image!.size)") 
println("New Size is: \(sender.frame.size))") 
println("Initial Scale: \(image!.scale)") 

image = imageResize(image!, size: CGSize(width: sender.frame.width, height: sender.frame.height)) 

println("Final Size is \(image!.size)") 
println("Final Scale: \(image!.scale)") 

這裏是控制檯輸出上面打印語句:

Starting Size is (750.0, 750.0) 
New Size is: (78.0, 78.0)) 
Initial Scale: 1.0 
Final Size is (78.0, 78.0) 
Final Scale: 2.0 

這裏是imageResize功能

func imageResize(image:UIImage, size:CGSize)-> UIImage { 
    UIGraphicsBeginImageContextWithOptions(size, false, 0) 
    var context = UIGraphicsGetCurrentContext() 

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh) 
    image.drawInRect(CGRect(origin: CGPointZero, size: size)) 

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return scaledImage 
} 

最後,這裏是屏幕截圖:

Example Image Resizing

更新:

爲了澄清,在屏幕截圖的底部的圖像是從鍵盤。這是一個UIButton,其中放置了全尺寸(750x750)的圖像。當我將圖像複製到粘貼板時,我首先使用全尺寸圖像並將其縮小至與鍵盤中UIButton的框架相匹配。所以我試圖讓文字信息中的圖像尺寸相同,並且在鍵盤上具有相同的圖像清晰度。

更新#2

我更新了我的圖片大小的功能調整圖像大小取決於屏幕比例:

func imageResize(image:UIImage, size:CGSize)-> UIImage { 

    let scale = UIScreen.mainScreen().scale 
    let newSize = CGSize(width: size.width/scale, height: size.height/scale) 

    UIGraphicsBeginImageContextWithOptions(newSize, false, scale) 
    var context = UIGraphicsGetCurrentContext() 

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh) 
    image.drawInRect(CGRect(origin: CGPointZero, size: newSize)) 

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return scaledImage 
} 

這裏是控制檯輸出將有關圖像的一些細節:

Starting Size is (750.0, 750.0) 
New Size is: (78.0, 78.0)) 
Initial Scale: 1.0 
Final Size is (39.0, 39.0) 
Final Scale: 2.0 

最後,這裏是設備上的圖像(iPhone 6):

Second Screenshot

正如你可以看到,儘管圖像具有適當的框架,它出現在鍵盤相比,UIButton的模糊。我應該能夠達到與UIButton相同的分辨率,因爲在這兩種情況下我都是從全尺寸圖像開始的。任何想法,爲什麼我失去了解決辦法?

更新#3

我更新了我的代碼由規模乘以圖像,而不是由它劃分。

let newSize = CGSize(width: size.width * scale, height: size.height * scale) 

下面是結果:

Starting Size is (750.0, 750.0) 
New Size is: (78.0, 78.0)) 
Initial Scale: 1.0 
Final Size is (156.0, 156.0) 
Final Scale: 2.0 

Update 3

我真的很感謝你的幫助,但我不還是不理解怎麼拉這一切在一起,以得到適當大小的照片。爲了完全闡明我的目標,我試圖使複製到消息中的圖像與鍵盤中的UIButton中的圖像完全相同。以下是我用於將圖像添加到粘貼板以將其複製到消息文本中的代碼。在圖像大小調整後運行粘貼板代碼:

pb.setData(UIImagePNGRepresentation(image), forPasteboardType: type) 
+0

什麼是模糊的一部分嗎?屏幕截圖中的較小圖像實際上是_sharper_! – matt

+0

如果您在此縮放圖像的像素較少,那麼它不會太尖銳。縮小至50x50像素的100x100像素圖像將具有1/4的像素數量。很明顯你在問什麼。 – zaph

+0

說:「如果我把它調整到我想要的大小的一半,那麼它會更模糊」爲什麼調整大小到預定大小的1/2。 – zaph

回答

1

注意:點不是像素。高分辨率屏幕可能有多個像素組成的點。大小通常以點爲單位指定,但圖像以像素爲單位。因此,對於視網膜顯示器,如果需要知道實際的固定尺寸,則必須使用比例因子。

如果圖像縮放到所需的點大小,並且顯示的分辨率高於點的大小,則scale> 1,圖像將顯得更加模糊。

如果您在運行時縮放,則需要通過顯示比例值來倍增所需的點大小以獲得像素大小的縮放比例。要獲得屏幕比例:

let scale = UIScreen.mainScreen().scale 
+0

我爲我的問題添加了第二個更新,我非常感謝你的幫助 – mgeno

+0

乘以不分。你想創建一個圖像(以點爲單位的scale * display_size)。 'let newSize = CGSize(width:size.width * scale,height:size.height * scale)'。如果顯示區域的大小爲78 x 78,則iPhone 6的inpixels顯示區域爲156 x 156.您希望以像素爲單位的縮放圖像爲顯示區域的大小(以像素爲單位)。 – zaph

+0

感謝您的幫助zaph,我更新了我的帖子以顯示正在發生的事情。你可以提供更多見解嗎? – mgeno

0

我回答了這個問題,因爲經過進一步的工作後,我發現問題與圖像大小無關。這個問題與粘貼板有關。 Zaph在他的建議中糾正了圖像大小調整問題是正確的。我張貼關於紙板這裏的後續問題:

Pasteboard UIImage not using scale