• 在Android中实现图片缩放和旋转


    图片处理在程序开发中也是经常用到的,手机上面经常就有图片浏览器,能将图片放大显示也能将图片显示为缩略图,同时也可以将图片竖着看或者横着看。这些都需要对图片进行处理,让其能够缩放和旋转。下面来看看Android中处理图片缩放和旋转的步骤。

    Matrix是在Android中用于操作图像的类,这个类中postScale和postRotate和分别实现图片缩放和旋转,具体步骤如下:

    一:对图片的缩放

    (1).先加载要操作的图片

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.gilr);

    (2).然后得到以上加载图片的高度跟宽度

    int height = bitmap.getHeight(); 
    int width = bitmap.getWidth();

    (3).接着定义要缩放成最终的图片高度跟宽度

    int nHeight = 200; 
    int nWidth = 150;

    (4).接着计算缩放比例

    float scaleWidth = ((float) nWidth)/width; 
    float scaleHeight = ((float) nHeight)/height;

    (5).然后创建Matrix对象

    Matrix matrix = new Matrix();

    (6).接着使用Matrix对象跟缩放比例实现缩放图片

    matrix.postScale(scaleWidth, scaleHeight);

    (7).最后生成缩放后的图片

    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height, matrix, true);

    二,对图片的旋转:

    (1)Matrix matrix = new Matrix();

    (2)matrix.postRotate(60);

    (3)Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height, matrix, true);

    三,以下是对图片进行缩放与旋转的完整例子,完整代码如下:

    在.xml文件中

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ImageView
    android:id="@+id/imageview"
    android:layout_width="200dp"
    android:layout_height="150dp"
    android:scaleType="fitCenter"
    android:src="@drawable/gilr"/>

    <TextView
    android:id="@+id/textview1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="图像宽度:240图像高度:160"/>
    <SeekBar
    android:id="@+id/seekbar1"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:max="240"
    android:progress="120"
    android:layout_marginLeft="10dp"></SeekBar>
    <TextView
    android:id="@+id/textview2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="0度"/>
    <SeekBar
    android:id="@+id/seekbar2"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:max="360"></SeekBar>

    </LinearLayout>

    在.java文件中:

    public class MainActivity extends Activity implements OnSeekBarChangeListener{
    
        private int minWidth = 80;  //图片最小宽度
        private ImageView imageView;
        private TextView textView1;
        private TextView textView2;
        private SeekBar seekBar1;
        private SeekBar seekBar2;
        private Matrix matrix = new Matrix();
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            imageView = (ImageView) findViewById(R.id.imageview);
            textView1 = (TextView) findViewById(R.id.textview1);
            textView2 = (TextView) findViewById(R.id.textview2);
            seekBar1 = (SeekBar) findViewById(R.id.seekbar1);
            seekBar2 = (SeekBar) findViewById(R.id.seekbar2);
            seekBar1.setOnSeekBarChangeListener(this);
            seekBar2.setOnSeekBarChangeListener(this);
            
            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            seekBar1.setMax(dm.widthPixels - minWidth);  //重新对SeekBar1设置最大值
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            // TODO 自动生成的方法存根
            if(seekBar.getId() == R.id.seekbar1){
                int newWidth = progress + mainWidth;
                int newHeight = (int)(newWidth * 3 / 4);  //图片高宽比列一定要以.xml文件中的ImageVie中高宽比列相同,否则实效
                imageView.setLayoutParams(new LinearLayout.LayoutParams(newWidth, newHeight));  //这里是通过布局大缩放图片大小
                textView1.setText("图像宽度:" + newWidth + "图像高度" + newHeight);
            }else if (seekBar.getId() == R.id.seekbar2) {
                
                 Bitmap bitmap = ((BitmapDrawable)(getResources().getDrawable(R.drawable.gilr))).getBitmap();
                 matrix.setRotate(progress);//设置翻转的角度
                 bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
                imageView.setImageBitmap(bitmap);
                textView2.setText(progress + "度");
                
            }
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO 自动生成的方法存根
            
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO 自动生成的方法存根
            
        }
    
        
    
    }

    运行结果:

    注意:

    Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。

    为了获取DisplayMetrics 成员,首先初始化一个对象如下:

    DisplayMetrics display= new DisplayMetrics();

    Log.d("DisplayMetrics ", display.toString());//直接在这里输出,信息都是0.

    getWindowManager().getDefaultDisplay().getMetrics(display);//将当前窗口的一些信息放在DisplayMetrics类中,

    Log.d("DisplayMetrics", display.toString());//然后就可以通过dispalyMetrics类来获取当前窗口的一些信息

    注:构造函数DisplayMetrics 不需要传递任何参数;getDefaultDisplay() 方法将取得的宽高维度存放于DisplayMetrics 对象中,而取得的宽高维度是以像素为单位(Pixel) ,“像素”所指的是“绝对像素”而非“相对像素”。

    通过 DisplayMetrics的 toString()方法可以获取到 DisplayMetrics的大部分 fields信息。

  • 相关阅读:
    从excel表中生成批量SQL,将数据录入到数据库中
    执行git命令时出现fatal: 'origin' does not appear to be a git repository错误
    小程序获取openid 出现null,{"errcode":40163,"errmsg":"code been used, hints: [ req_id: WNUzlA0105th41 ]"}
    由客户端内部通讯引发的插件化开发的随想和实践
    Prism6下的MEF:基于微软企业库的Cache
    从微信SDK看ProtoBuffer文件的生成
    Prism6下的MEF:添加Logger
    Prism6下的MEF:第一个Hello World
    讲讲Windows10(UWP)下的Binding
    Windows10(UWP)下的MEF
  • 原文地址:https://www.cnblogs.com/SoulCode/p/5388569.html
Copyright © 2020-2023  润新知