简体   繁体   English

如何以编程方式压缩图像

[英]How to compress images programmatically

I have 30 to 40 images in my resource folder. 我的资源文件夹中有30到40张图像。 And I am currently using DrawBitpMap() to draw it in my screen. 我目前正在使用DrawBitpMap()在我的屏幕上绘制它。 But It gives me an error "VM outOfMemeory error". 但它给我一个错误“VM outOfMemeory错误”。 So I tried to resize the images. 所以我试着调整图像的大小。 Now my image resolution is 160x160. 现在我的图像分辨率是160x160。 Now I don't get that error. 现在我没有得到那个错误。 it runs without any problem. 它运行没有任何问题。 So my question is, Is there anyway I could compress my images programmatically instead of manually resizing the images in resources? 所以我的问题是,无论如何我可以以编程方式压缩我的图像而不是手动调整资源中的图像大小?

try using this example 尝试使用这个例子

public class bitmaptest extends Activity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        LinearLayout linLayout = new LinearLayout(this);

        // load the origial BitMap (500 x 500 px)
        Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), 
               R.drawable.android);

        int width = bitmapOrg.width();
        int height = bitmapOrg.height();
        int newWidth = 200;
        int newHeight = 200;

        // calculate the scale - in this case = 0.4f
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        // createa matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
        // rotate the Bitmap
        matrix.postRotate(45);

        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
                          width, height, matrix, true); 

        // make a Drawable from Bitmap to allow to set the BitMap 
        // to the ImageView, ImageButton or what ever
        BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);

        ImageView imageView = new ImageView(this);

        // set the Drawable on the ImageView
        imageView.setImageDrawable(bmd);

        // center the Image
        imageView.setScaleType(ScaleType.CENTER);

        // add ImageView to the Layout
        linLayout.addView(imageView, 
            new LinearLayout.LayoutParams(
                      LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT
                )
        );

        // set LinearLayout as ContentView
        setContentView(linLayout);
    }
}

you can also do 你也可以

Bitmap.createScaledBitmap(yourimage, 160, 160, true);

To compress an image in android, use the method compress from the class Bitmap . 要在android中压缩图像,请使用Bitmap类中的方法compress

But I believe you want to scale , rather than compress . 但我相信你想要扩展 ,而不是压缩 There is a method in the same class to scale it. 同一类中有一种方法可以扩展它。

Alternatively, instead of resizing the image every time it reads it, use ImageMagick in a batch file to resize them in a PC, and copy them to the res/ folder already resized. 或者,不是每次读取图像时调整图像大小,而是在批处理文件中使用ImageMagick在PC中调整大小,然后将它们复制到已调整大小的res /文件夹中。

这就是我解决这个问题的方法。

Bitmap originalImage= Bitmap.createScaledBitmap (BitmapFactory.decodeResource(getResources(), imageId), 160, 160, true);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM