android处理图片

 
/* 定义DisplayMetrics对象 */
  DisplayMetrics dm = new DisplayMetrics();
 
  /* 取得窗口属性 */
  getWindowManager().getDefaultDisplay().getMetrics(dm);
1.基本图像绘制
 /* 创建两个图片对象 */
 Bitmap   mBitQQ  = null;
 Bitmap   mBitDestTop = null;

 int    miDTX  = 0;

 public GameView(Context context)
 {
  super(context);
 
  mPaint = new Paint();
 
  miDTX  = 0;
 
  /* 从资源文件中装载图片 */
  //getResources()->得到Resources
  //getDrawable()->得到资源中的Drawable对象,参数为资源索引ID
  //getBitmap()->得到Bitmap
  mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();
 
  mBitDestTop = ((BitmapDrawable) getResources().getDrawable(R.drawable.desktop)).getBitmap();
 
  new Thread(this).start();
 }
 
 public void onDraw(Canvas canvas)
 {
  super.onDraw(canvas);
 
  /* 清屏效果 */
  canvas.drawColor(Color.GRAY);
 
  /* 在屏幕(0,0)处绘制图片mBitQQ */
  GameView.drawImage(canvas, mBitQQ, 0, 0);
 
  /* 在制定位置按指定裁剪的渔区进行绘制 */
  //getWidth()->得到图片的宽度
  //getHeight()->得到图片的高度
  GameView.drawImage(canvas, mBitDestTop, miDTX, mBitQQ.getHeight(), mBitDestTop.getWidth(), mBitDestTop.getHeight()/2, 0, 0);
 
 }
 

2。旋转图片
public void onDraw(Canvas canvas)
 {
  super.onDraw(canvas);
 
  /* 重置mMatrix */
  mMatrix.reset();
 
  /* 设置旋转 */
  mMatrix.setRotate(Angle);
 
  /* 按mMatrix得旋转构建新的Bitmap */
  Bitmap mBitQQ2 = Bitmap.createBitmap(mBitQQ, 0, 0, BitQQwidth,BitQQheight, mMatrix, true);

  /* 绘制旋转之后的图片 */
  GameView.drawImage(canvas, mBitQQ2, (320-BitQQwidth)/2, 10);
 
  mBitQQ2 = null;
 }
3。缩放图片
public void onDraw(Canvas canvas)
 {
  super.onDraw(canvas);
 
  /* 重置mMatrix */
  mMatrix.reset();
 
  /* 设置缩放 */
  mMatrix.postScale(Scale,Scale);
 
  /* 按mMatrix得旋转构建新的Bitmap */
  Bitmap mBitQQ2 = Bitmap.createBitmap(mBitQQ, 0, 0, BitQQwidth,BitQQheight, mMatrix, true);

  /* 绘制旋转之后的图片 */
  GameView.drawImage(canvas, mBitQQ2, (320-BitQQwidth)/2, 10);
 
  mBitQQ2 = null;
 }
4。混合渲染
/* 得到图片的宽度和高度 */
  BitQQwidth = mBitQQ.getWidth();
  BitQQheight = mBitQQ.getHeight();
 
  /* 创建BitmapShader对象 */
  mBitmapShader = new BitmapShader(mBitQQ,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);
 
  /* 创建LinearGradient并设置渐变的颜色数组 */
  mLinearGradient = new LinearGradient(0,0,100,100,
            new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},
            null,Shader.TileMode.REPEAT);
  /* 这里笔者理解为“混合渲染”--大家可以有自己的理解,能明白这个意思就好*/
  mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);
 
  /* 构建RadialGradient对象,设置半径的属性 */
  //这里使用了BitmapShader和LinearGradient进行混合
  //当然也可以使用其他的组合
  //混合渲染的模式很多,可以根据自己需要来选择
  mRadialGradient = new RadialGradient(50,200,50,
            new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},
            null,Shader.TileMode.REPEAT);
  /* 构建SweepGradient对象 */
  mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);

  mPaint = new Paint();
 
  /* 开启线程 */
  new Thread(this).start();
 }
 
 public void onDraw(Canvas canvas)
 {
  super.onDraw(canvas);
 
  //将图片裁剪为椭圆形
  /* 构建ShapeDrawable对象并定义形状为椭圆 */
  mShapeDrawableQQ = new ShapeDrawable(new OvalShape());

  /* 设置要绘制的椭圆形的东西为ShapeDrawable图片 */
  mShapeDrawableQQ.getPaint().setShader(mBitmapShader);
 
  /* 设置显示区域 */
  mShapeDrawableQQ.setBounds(0,0, BitQQwidth, BitQQheight);
 
  /* 绘制ShapeDrawableQQ */
  mShapeDrawableQQ.draw(canvas);  
 
  //绘制渐变的矩形
  mPaint.setShader(mLinearGradient);
  canvas.drawRect(BitQQwidth, 0, 320, 156, mPaint);
 
  //显示混合渲染效果
  mPaint.setShader(mComposeShader);
  canvas.drawRect(0, 300, BitQQwidth, 300+BitQQheight, mPaint);
 
  //绘制环形渐变
  mPaint.setShader(mRadialGradient);
  canvas.drawCircle(50, 200, 50, mPaint);
 
  //绘制梯度渐变
  mPaint.setShader(mSweepGradient);
  canvas.drawRect(150, 160, 300, 300, mPaint);
 
 }
5。图片水纹处理
public class GameView extends View implements Runnable
{
    int BACKWIDTH;

    int BACKHEIGHT;

    short[] buf2;

    short[] buf1;

    int[] Bitmap2;

    int[] Bitmap1;
   
 public GameView(Context context)
 {
  super(context);
 
  /* 装载图片 */
     Bitmap   image = BitmapFactory.decodeResource(this.getResources(),R.drawable.qq);
     BACKWIDTH = image.getWidth();
     BACKHEIGHT = image.getHeight();
    
        buf2 = new short[BACKWIDTH * BACKHEIGHT];
        buf1 = new short[BACKWIDTH * BACKHEIGHT];
        Bitmap2 = new int[BACKWIDTH * BACKHEIGHT];
        Bitmap1 = new int[BACKWIDTH * BACKHEIGHT];

        /* 加载图片的像素到数组中 */
        image.getPixels(Bitmap1, 0, BACKWIDTH, 0, 0, BACKWIDTH, BACKHEIGHT);
 
  new Thread(this).start();
 }
 
 
    void DropStone(int x,// x坐标
       int y,// y坐标
       int stonesize,// 波源半径
       int stoneweight)// 波源能量
 {
  for (int posx = x - stonesize; posx < x + stonesize; posx++)
   for (int posy = y - stonesize; posy < y + stonesize; posy++)
    if ((posx - x) * (posx - x) + (posy - y) * (posy - y) < stonesize * stonesize)
     buf1[BACKWIDTH * posy + posx] = (short) -stoneweight;
 }
   
   
    void RippleSpread()
 {
  for (int i = BACKWIDTH; i < BACKWIDTH * BACKHEIGHT - BACKWIDTH; i++)
  {
   // 波能扩散
   buf2[i] = (short) (((buf1[i - 1] + buf1[i + 1] + buf1[i - BACKWIDTH] + buf1[i + BACKWIDTH]) >> 1) - buf2[i]);
   // 波能衰减
   buf2[i] -= buf2[i] >> 5;
  }

  // 交换波能数据缓冲区
  short[] ptmp = buf1;
  buf1 = buf2;
  buf2 = ptmp;
 }

    /* 渲染你水纹效果 */
 void render()
 {
  int xoff, yoff;
  int k = BACKWIDTH;
  for (int i = 1; i < BACKHEIGHT - 1; i++)
  {
   for (int j = 0; j < BACKWIDTH; j++)
   {
    // 计算偏移量
    xoff = buf1[k - 1] - buf1[k + 1];
    yoff = buf1[k - BACKWIDTH] - buf1[k + BACKWIDTH];

    // 判断坐标是否在窗口范围内
    if ((i + yoff) < 0)
    {
     k++;
     continue;
    }
    if ((i + yoff) > BACKHEIGHT)
    {
     k++;
     continue;
    }
    if ((j + xoff) < 0)
    {
     k++;
     continue;
    }
    if ((j + xoff) > BACKWIDTH)
    {
     k++;
     continue;
    }

    // 计算出偏移象素和原始象素的内存地址偏移量
    int pos1, pos2;
    pos1 = BACKWIDTH * (i + yoff) + (j + xoff);
    pos2 = BACKWIDTH * i + j;
    Bitmap2[pos2++] = Bitmap1[pos1++];
    k++;
   }
  }
 }
   
 public void onDraw(Canvas canvas)
 {
  super.onDraw(canvas);
 
  /* 绘制经过处理的图片效果 */
  canvas.drawBitmap(Bitmap2, 0, BACKWIDTH, 0, 0, BACKWIDTH, BACKHEIGHT, false, null);
 }
 
 // 触笔事件
 public boolean onTouchEvent(MotionEvent event)
 {
 
  return true;
 }

 // 按键按下事件
 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
  return true;
 }

 // 按键弹起事件
 public boolean onKeyUp(int keyCode, KeyEvent event)
 {
  DropStone(BACKWIDTH/2, BACKHEIGHT/2, 10, 30);
  return false;
 }

 public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
 {
  return true;
 }
 
 /**
  * 线程处理
  */
 public void run()
 {
  while (!Thread.currentThread().isInterrupted())
  {
   try
   {
    Thread.sleep(50);
   }
   catch (InterruptedException e)
   {
    Thread.currentThread().interrupt();
   }
         RippleSpread();
         render();
   //使用postInvalidate可以直接在线程中更新界面
   postInvalidate();
  }
 }
}

时间: 2024-12-24 20:28:09

android处理图片的相关文章

android 处理图片的算法

问题描述 android 处理图片的算法 android 处理图片的算法 有哪些好用的 ? 求大神推荐...................................... 解决方案 http://cdmd.cnki.com.cn/Article/CDMD-10013-1011121284.htm 看看能不能帮到你 解决方案二: 你可以安装使用opencv的库,里面有很多图像处理算法,而且网上资料也很全. 解决方案三: 自己实现,或移植开源的图形图像处理都可以.例如:android图片特效

《Master Opencv...读书笔记》卡通化效果移植到android系统

昨天CSDN博客抽风了.这是第7次编辑这个文件了,之前老是提交失败!     声明 1.电脑比较坑爹,前置摄像头坏掉了. 2.卡通化效果运行比较慢,老外的书上说是,人每触摸一下屏幕,才生成一张卡通化效果的图片 因此,为了简便期间,我就只对一副图像进行卡通化效果. 原理什么的见前面的文章,本文的目的,是熟悉ndk和jni   环境需求: eclipse juno ndk(r9) android sdk 4.4 api 19 opencv 2.4.7 android版本 cygwin 准备工作: 1

android-Android中xml报oom,怎么解决

问题描述 Android中xml报oom,怎么解决 最近项目总是碰到oom,一个界面直接点进去不会报oom,但是如果其他界面点击多了,再点击那个界面就会报xml的oom,定位到xml那一行就是一个ImageView的src设置了一个背景图片. 感觉就是有内存没有回收,不然如果是图片太大,第一次应该会oom,但是第一次直接点不会报oom,其他界面点多了再点那个界面就会报oom 错误截图 04-15 11:27:51.711: E/AndroidRuntime(13268): FATAL EXCEP

Android在处理图片减少出现OOM的方式

在做Android图片程序的时候,由于图片比较多,很有很的机会出现OOM的机会,根据网上的资料做了些总结,期待能够减少OOM出现的机会. 1.使用底层的方法来替代使用java层的方法      尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图.   因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactor

Android使用开源框架Fresco处理图片

关于Fresco的优点大家自行谷歌吧,它太强大太优秀了,我这一片小博文容纳不下啊羡慕,今天主要给大家简单介绍下Fresco的使用以及一些属性的介绍. Fresco是一个强大的图片加载组件.使用它之后,你不需要再去关心图片的加载和显示这些繁琐的事情!支持Android2.3及以后的版本. 官网详细介绍了Fresco一些特性,我第一次看确实是惊呆了.https://www.fresco-cn.org/ 2016年Fresco的最新的源码分析:https://github.com/desmond112

Android的TextView/EditText使用CharacterStyle&amp;amp;SpannableString来处理图片显示、字体样式、超链接等

http://www.cnblogs.com/playing/archive/2011/03/18/1988182.html

Android的TextView使用Html来处理图片显示、字体样式、超链接等

http://www.cnblogs.com/playing/archive/2011/03/17/1987033.html

[Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印

    前一篇文章讲述了Android实现图片Matrix矩阵类缩放.旋转.对比度.亮度.饱和度处理,但是真正的图片软件都是使用触屏实现图片缩放.移动.添加水印等功能,所以该篇文章主要通过setOnTouchListener监听实现该功能.希望文章对大家有所帮助. 一.图片缩放实现     首先先简单介绍Android如何实现触屏缩放图片和移动图片,新建TouchImageViw工程.设计XML中activity_main.xml布局: <RelativeLayout xmlns:android

[Android] 图像处理整合之处理ColorMatrix和Intend传递路径显示图像

    经过几门考试之后,终于有时间整合下自己的Anroid项目"随手拍"的图像处理部分了,主要是结合前面几篇文章讲解的各种android图像处理技术和PopupWindow布局,图像初步整合效果如下.由于该软件目前还未答辩,所以结束后会共享所有的源代码,可能需要一个月后吧,抱歉~                   在"随手拍"中点击发布,有添加图片按钮,点击出现"选择本地图片"和"照相截拆选择",显示图片至另一个处理界面,