2017-05-19 78 views
1

我通過Glide轉換對圖像執行轉換,將其設置爲背景以黑色背景,然後將設備另存爲PNG。視圖看起來是這樣的:保存後位圖壓縮顆粒圖像

enter image description here

壓縮它,將其保存爲PNG文件後,它看起來像這樣:

enter image description here

忽略的大小和背景的差異,各地注意顆粒感邊緣。保存後這一點仍然存在。 PNG與原始圖像尺寸相同,因此不進行縮放。我如何防止這種情況發生?壓縮的代碼是:

File file = new File(context.getFilesDir().getPath() + "/" + String.valueOf(num) + ".png"); 
OutputStream os = null; 
try { 
    os = new FileOutputStream(file); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os); 

屬性設置爲位圖分別爲:

Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
b.setHasAlpha(true); 

事情我已經嘗試:

  • 使用WEBP;同樣的問題。
  • 保存視圖並構建繪圖緩存 然後保存該位圖。同樣的問題。
  • 因爲我需要alpha層,所以無法使用JPEG。

它看起來像壓縮PNG無法處理明亮的顏色。

更新:

使用RGB_565代替ARGB_8888消除顆粒感,但增加了黑色的外面,因爲沒有阿爾法層。似乎壓縮無法處理它,如果有任何alpha像素。

+0

你執行了哪些轉換?附加到問題的源圖像是254x266,您的轉換圖像是180x180。那麼你真的做了一些調整?如果是這樣,你是如何做到的?調整特別是不保存寬高比的調整可能是某些工件的來源。 – SergGr

+0

@sergr模糊變換和一個邊緣檢測。忽略這些的大小。我以互聯網上的這一個爲例。 – ono

+0

還有一件事與調整大小有關:什麼是透明像素的RGB顏色(即如何將黑色轉換爲透明)?如果你做這樣的調整大小可能很重要,請參閱http://www.adriancourreges.com/blog/2017/05/09/beware-of-transparent-pixels/ – SergGr

回答

0

嘗試使用BitmapFactory.decodeFile

String filePath = context.getFilesDir().getPath() + "/" + String.valueOf(num) + ".png"; 

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
options.inDither = false; 

BitmapFactory.decodeFile(filePath, options); 

備選地,可以使用createScaledBitmap方法,它有一個標誌在這裏可以設置如果縮放後​​的圖像應該過濾或沒有。該標誌提高了位圖的質量。

boolean shouldFilter = false; 
bitmap.createScaledBitmap(bitmap, desiredWidth, desiredHeight, shouldFilter);