Sai*_*ira 27 algorithm scaling android image
我需要缩小来自网络流的图像,而不会降低质量.
我知道这个解决方案的怪掉的内存问题,同时加载到一个位图对象的图像,但它太粗- inSampleSize是一个整数,不允许通过所产生的尺寸更精细的控制.也就是说,我需要将图像缩放到特定的h/w尺寸(并保持纵横比).
我不介意在我的代码中使用DIY bicubic/lancoz算法,但我找不到任何适用于Android的示例,因为它们都依赖于Java2D(JavaSE).
编辑:我附上了一个快速的来源.原来是720x402高清屏幕截图.请忽略前2个缩略图.Android(作为布局的一部分)将顶部大图像自动调整为大约130x72.它很好很清脆.底部图像使用API调整大小并且具有严重的伪像

我也试过使用BitmapFactory,正如我之前所说,它有两个问题 - 无法缩放到精确的大小,缩放的图像模糊.
关于如何修复艺术的任何想法?
谢谢,所以!
    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>
小智 9
您可以使用BitmapFactory.Options与BitmapFactory.decode功能(S),
使用inDensity和inTargetDensity
例如:你有1600×1200尺寸的图像,并希望调整到640×480
 
,然后'inDensity'=5和'inTargetDensity'=2(1600x2等于640x5).
希望这个帮助.
顶部大图像按布局缩小到450px,因此没有伪影.
底部大图像的瑕疵是通过布局将其缩小到130px宽然后再上升到大约450px.所以工件是由你的缩放产生的.尝试
Bitmap resized = getResizedBitmap(original, 450);
在你的代码中它应该没问题.但是,您需要将其调整到手机的实际屏幕宽度.
| 归档时间: | 
 | 
| 查看次数: | 37719 次 | 
| 最近记录: |