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