閱讀726 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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();
  }
 }
}

最後更新:2017-04-02 06:51:45

  上一篇:go Bitmap 詳細介紹
  下一篇:go 如何破解Flex4序列號失效問題