我需要縮小來自網絡流的圖像而不會丟失質量。Android:高質量圖像大小調整/縮放
我知道這個解決方案Strange out of memory issue while loading an image to a Bitmap object,但它太粗糙 - inSampleSize
是一個整數,不允許更好地控制生成的維度。也就是說,我需要將圖像縮放到特定的h/w尺寸(並保持寬高比)。
我不具有我的代碼DIY雙三次/ lancoz算法的頭腦,但我不能找到,將在Android上工作,因爲他們都依賴於Java2D的(JavaSE的)任何例子。編輯: 我附上了一個快速的來源。原來是720x402高清屏幕捕捉。請忽略前兩個縮略圖。頂部大圖像由android(作爲佈局的一部分)自動調整大約130x72。它很好,很脆。底部的圖像的大小與API和有嚴重的僞像
我使用BitmapFactory和也試過,正如我剛纔所說,它有兩個問題 - 沒有辦法擴展到精確的尺寸和比例圖像模糊。
任何想法如何解決artifcating?
謝謝,S.O.!
package qp.test;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.widget.ImageView;
public class imgview extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.a000001570402);
Bitmap resized = getResizedBitmap(original, 130);
//Bitmap resized = getResizedBitmap2(original, 0.3f);
System.err.println(resized.getWidth() + "x" + resized.getHeight());
ImageView image = (ImageView) findViewById(R.id.ImageViewFullManual);
image.setImageBitmap(resized);
}
private Bitmap getResizedBitmap(Bitmap bm, int newWidth) {
int width = bm.getWidth();
int height = bm.getHeight();
float aspect = (float)width/height;
float scaleWidth = newWidth;
float scaleHeight = scaleWidth/aspect; // yeah!
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth/width, scaleHeight/height);
// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
bm.recycle();
return resizedBitmap;
}
private Bitmap getResizedBitmap2(Bitmap bm, float scale) {
/* float aspect = bm.getWidth()/bm.getHeight();
int scaleWidth = (int) (bm.getWidth() * scale);
int scaleHeight = (int) (bm.getHeight() * scale);
*/
// original image is 720x402 and SampleSize=4 produces 180x102, which is
// still too large
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inSampleSize = 4;
return BitmapFactory.decodeResource(getResources(), R.drawable.a000001570402, bfo);
}
}
並且佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<!-- <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="hullo" android:background="#00ff00"
/>
-->
<ImageView android:id="@+id/ImageViewThumbAuto"
android:layout_width="130dip" android:layout_height="72dip"
android:src="@drawable/a000001570402" />
<ImageView android:id="@+id/ImageViewThumbManual"
android:layout_width="130dip" android:layout_height="72dip"
android:src="@drawable/a000001570402"
android:layout_toRightOf="@id/ImageViewThumbAuto"
/>
<ImageView android:id="@+id/ImageViewFullAuto" android:layout_width="300dip"
android:layout_height="169dip"
android:scaleType="fitXY"
android:src="@drawable/a000001570402"
android:layout_below="@id/ImageViewThumbAuto"
/>
<ImageView android:id="@+id/ImageViewFullManual" android:layout_width="300dip"
android:layout_height="169dip"
android:scaleType="fitXY"
android:src="@drawable/a000001570402"
android:layout_below="@id/ImageViewFullAuto"
/>
</RelativeLayout>
我不要認爲頂部圖像實際上是130px寬。 http://icons-search.com/img/fasticon/fast_emoticons_lnx.zip/fast_emoticons_lnx-Icons-128X128-smile_1.png-128x128.png是128像素寬.... – Quamis 2011-04-20 09:20:03
檢查出[本教程](http:///developer.android.com/training/displaying-bitmaps/index.html)解碼圖像。 – 2013-01-18 14:14:48
嗨!面對同樣的問題,你找到解決方案嗎? – Dehimb 2016-08-11 16:35:12