我通过拍照获得一个图片,如何对这个图片进行旋转和缩放,使之能成为一个合适大小的icon?

2011-01-30 07:58:40

3 Answers

我提供一个实现动态缩放和旋转图像的代码(参数可以在配制文件里动态设置): 

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <TextView android:layout_gravity="center_horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <ImageView android:id="@+id/one" android:layout_width="150dp" android:layout_height="160dp" android:src="@drawable/b" android:scaleType="fitCenter" /> <TextView android:id="@+id/tv1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="图像宽度:149 图像高度:159" /> <SeekBar android:progress="120" android:id="@+id/s1" android:layout_height="wrap_content" android:max="240" android:layout_width="fill_parent" android:layout_marginTop="20dp"> </SeekBar> <TextView android:id="@+id/tv2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="0度" /> <SeekBar android:id="@+id/s2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:max="360" /> </LinearLayout> package csf.imamgeview; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.util.DisplayMetrics; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; public class csf extends Activity implements OnSeekBarChangeListener{ private int m= 29,n=39;//图像的最小宽度和高度。 private ImageView one; private TextView tv1, tv2; private Matrix matrix = new Matrix(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); one=(ImageView)findViewById(R.id.one); tv1=(TextView)findViewById(R.id.tv1); tv2=(TextView)findViewById(R.id.tv2); SeekBar s1=(SeekBar)findViewById(R.id.s1); SeekBar s2=(SeekBar)findViewById(R.id.s2); s1.setOnSeekBarChangeListener(this); s2.setOnSeekBarChangeListener(this); //为了自适应屏幕的宽度,使图你放大到与屏幕宽度相等时为止,使用如下代码来获得屏幕的宽度,并将屏幕宽度与图像的最小宽度的差作为android:max属性 //的值 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); s1.setMax(dm.widthPixels - m); } @Override //在SeekBar类的onProgressChanged事件方法中需要控制图像的缩放和旋转 public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { //处理图像缩放 if(seekBar.getId()==R.id.s1) { int newwidth=progress+m;//计算处缩放后图像的新宽度 int newheigth=(int)progress*159/149+n;//计算处缩放后图像的新高度 //设置ImageView的大小 one.setLayoutParams(new LinearLayout.LayoutParams(newwidth,newheigth)); tv1.setText("图像宽度:"+newwidth+" 图像高度:"+newheigth); } //处理图像旋转 if(seekBar.getId()==R.id.s2) { //装载R.drawable.b图像文件,并返回Bitmap对像 Bitmap bitmap=((BitmapDrawable) getResources().getDrawable(R.drawable.b)).getBitmap(); //设置图像的旋转角度 matrix.setRotate(progress); //旋转图像,并生成新的Bitmap对像 bitmap=Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); //重新在ImageView组件中显示旋转后的图像 one.setImageBitmap(bitmap); tv2.setText(progress+"度"); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } }
2011-01-30 11:47:23

使用Android中的Matrix类实现: 

//加载需要操作的图片 Bitmap bitmapOrg = BitmapFactory.decoreResource(getResource(),R.drawable.eoe_andrid); //获取这个图片的宽度和高度 int width = bitmapOrg.getWidth(); int hegith = bitmapOrg.getHeight(); //定义预转化成的图片的宽度和高度 int newWidht =200; int newHeight=200; //计算缩放率,新尺寸除原始尺寸 float scaleWidth = ((float)newWidth)/width; float scaleHeight= ((float)newHeight)/height; //创建操作图片用的Matrix对象 Matrix matrix = new Matrix(); //缩放图像动作 matrix.postScale(scaleWidth,scaleHeight); //旋转图片 matrix.postRotate(45); 创建新的图片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg,0,0,width,hegith,matrix,true); //将上面的创建的Bitmap转化成Drawable对象 BitmapDrawable bmb = new BitmapDrawable(resizedBitmap); //创建一个imageview ImageView imageView = new ImageView(this); imageView.setImageDrawable(bmb);
2011-01-30 13:26:24

变更图片的大小, 方向, 关键在于重新产生一张图片, 变更其状态后, 再取代表原本的图片。
缩放图片大小 

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.darwable.icon); 
// (float) scaleWidth: 缩放寬度 
// (float) scaleHeight: 缩放高度 
bmpWidth = bmp.getWidth(); 
bmpHeight = bmp.getHeight(); 
Matrix matrix = new Matrix(); 
matrix.postScale(scaleWidth, scaleHeight); 
Bitmap resizeBmp = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true); 

旋转图片 

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon); bmpWidth = bmp.getWidth(); bmpHeight = bmp.getHeight(); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); matrix.setRotate(-5); Bitmap resizeBmp = Bmp.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true);
2011-01-30 09:46:25
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制