android图片处理方法(转)

  1. //压缩图片大小
  2. public static Bitmap compressImage(Bitmap image) {
  3. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  4. image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
  5. int options = 100;
  6. while ( baos.toByteArray().length / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩
  7. baos.reset();//重置baos即清空baos
  8. image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
  9. options -= 10;//每次都减少10
  10. }
  11. ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
  12. Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
  13. return bitmap;
  14. }
  1. /**
  2. * 将彩色图转换为灰度图
  3. * @param img 位图
  4. * @return  返回转换好的位图
  5. */
  6. public Bitmap convertGreyImg(Bitmap img) {
  7. int width = img.getWidth();         //获取位图的宽
  8. int height = img.getHeight();       //获取位图的高
  9. int []pixels = new int[width * height]; //通过位图的大小创建像素点数组
  10. img.getPixels(pixels, 0, width, 0, 0, width, height);
  11. int alpha = 0xFF << 24;
  12. for(int i = 0; i < height; i++)  {
  13. for(int j = 0; j < width; j++) {
  14. int grey = pixels[width * i + j];
  15. int red = ((grey  & 0x00FF0000 ) >> 16);
  16. int green = ((grey & 0x0000FF00) >> 8);
  17. int blue = (grey & 0x000000FF);
  18. grey = (int)((float) red * 0.3 + (float)green * 0.59 + (float)blue * 0.11);
  19. grey = alpha | (grey << 16) | (grey << 8) | grey;
  20. pixels[width * i + j] = grey;
  21. }
  22. }
  23. Bitmap result = Bitmap.createBitmap(width, height, Config.RGB_565);
  24. result.setPixels(pixels, 0, width, 0, 0, width, height);
  25. return result;
  26. }

android图片处理方法(转)

将一个图片切割成多个图片 
有种场景,我们想将一个图片切割成多个图片。比如我们在开发一个拼图的游戏,就首先要对图片进行切割。 
以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。 
一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量。

  1. import android.graphics.Bitmap;
  2. public class ImagePiece {
  3. public int index = 0;
  4. public Bitmap bitmap = null;
  5. }

一个是ImageSplitter类,有一个静态方法split,传入的参数是要切割的Bitmap对象,和横向和竖向的切割片数。比如传入的是3、3,则横竖向都切割成3片,最终会将整个图片切割成3X3=9片。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import android.graphics.Bitmap;
  4. public class ImageSplitter {
  5. public static List<ImagePiece> split(Bitmap bitmap, int xPiece, int yPiece) {
  6. List<ImagePiece> pieces = new ArrayList<ImagePiece>(xPiece * yPiece);
  7. int width = bitmap.getWidth();
  8. int height = bitmap.getHeight();
  9. int pieceWidth = width / 3;
  10. int pieceHeight = height / 3;
  11. for (int i = 0; i < yPiece; i++) {
  12. for (int j = 0; j < xPiece; j++) {
  13. ImagePiece piece = new ImagePiece();
  14. piece.index = j + i * xPiece;
  15. int xValue = j * pieceWidth;
  16. int yValue = i * pieceHeight;
  17. piece.bitmap = Bitmap.createBitmap(bitmap, xValue, yValue,
  18. pieceWidth, pieceHeight);
  19. pieces.add(piece);
  20. }
  21. }
  22. return pieces;
  23. }
  24. }

1、图标加灰色过滤; 
2、android的图片资源默认是静态的,单实例;如果两个IM好友的头像一样,最简单的都是用的软件自带头像,有一个在线,一个离线,直接改变头像的灰度,则两个用户的头像都会变灰或者在线,答案是:Drawable.mutate()。

  1. Drawable mDrawable = context.getResources().getDrawable(R.drawable.face_icon);
  2. //Make this drawable mutable.
  3. //A mutable drawable is guaranteed to not share its state with any other drawable.
  4. mDrawable.mutate();
  5. ColorMatrix cm = new ColorMatrix();
  6. cm.setSaturation(0);
  7. ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
  8. mDrawable.setColorFilter(cf);

生成缩略图,抠自android launcher源码:

  1. /*
  2. * Copyright (C) 2008 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. *      http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.android.launcher;
  17. import android.graphics.drawable.BitmapDrawable;
  18. import android.graphics.drawable.Drawable;
  19. import android.graphics.drawable.PaintDrawable;
  20. import android.graphics.Bitmap;
  21. import android.graphics.PixelFormat;
  22. import android.graphics.Canvas;
  23. import android.graphics.PaintFlagsDrawFilter;
  24. import android.graphics.Paint;
  25. import android.graphics.Rect;
  26. import android.content.res.Resources;
  27. import android.content.Context;
  28. /**
  29. * Various utilities shared amongst the Launcher's classes.
  30. */
  31. final class Utilities {
  32. private static int sIconWidth = -1;
  33. private static int sIconHeight = -1;
  34. private static final Paint sPaint = new Paint();
  35. private static final Rect sBounds = new Rect();
  36. private static final Rect sOldBounds = new Rect();
  37. private static Canvas sCanvas = new Canvas();
  38. static {
  39. sCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG,
  40. Paint.FILTER_BITMAP_FLAG));
  41. }
  42. /**
  43. * Returns a Drawable representing the thumbnail of the specified Drawable.
  44. * The size of the thumbnail is defined by the dimension
  45. * android.R.dimen.launcher_application_icon_size.
  46. *
  47. * This method is not thread-safe and should be invoked on the UI thread only.
  48. *
  49. * @param icon The icon to get a thumbnail of.
  50. * @param context The application's context.
  51. *
  52. * @return A thumbnail for the specified icon or the icon itself if the
  53. *         thumbnail could not be created.
  54. */
  55. static Drawable createIconThumbnail(Drawable icon, Context context) {
  56. if (sIconWidth == -1) {
  57. final Resources resources = context.getResources();
  58. sIconWidth = sIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size);
  59. }
  60. int width = sIconWidth;
  61. int height = sIconHeight;
  62. float scale = 1.0f;
  63. if (icon instanceof PaintDrawable) {
  64. PaintDrawable painter = (PaintDrawable) icon;
  65. painter.setIntrinsicWidth(width);
  66. painter.setIntrinsicHeight(height);
  67. } else if (icon instanceof BitmapDrawable) {
  68. // Ensure the bitmap has a density.
  69. BitmapDrawable bitmapDrawable = (BitmapDrawable) icon;
  70. Bitmap bitmap = bitmapDrawable.getBitmap();
  71. if (bitmap.getDensity() == Bitmap.DENSITY_NONE) {
  72. bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics());
  73. }
  74. }
  75. int iconWidth = icon.getIntrinsicWidth();
  76. int iconHeight = icon.getIntrinsicHeight();
  77. if (width > 0 && height > 0) {
  78. if (width < iconWidth || height < iconHeight || scale != 1.0f) {
  79. final float ratio = (float) iconWidth / iconHeight;
  80. if (iconWidth > iconHeight) {
  81. height = (int) (width / ratio);
  82. } else if (iconHeight > iconWidth) {
  83. width = (int) (height * ratio);
  84. }
  85. final Bitmap.Config c = icon.getOpacity() != PixelFormat.OPAQUE ?
  86. Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
  87. final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
  88. final Canvas canvas = sCanvas;
  89. canvas.setBitmap(thumb);
  90. // Copy the old bounds to restore them later
  91. // If we were to do oldBounds = icon.getBounds(),
  92. // the call to setBounds() that follows would
  93. // change the same instance and we would lose the
  94. // old bounds
  95. sOldBounds.set(icon.getBounds());
  96. final int x = (sIconWidth - width) / 2;
  97. final int y = (sIconHeight - height) / 2;
  98. icon.setBounds(x, y, x + width, y + height);
  99. icon.draw(canvas);
  100. icon.setBounds(sOldBounds);
  101. icon = new FastBitmapDrawable(thumb);
  102. } else if (iconWidth < width && iconHeight < height) {
  103. final Bitmap.Config c = Bitmap.Config.ARGB_8888;
  104. final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
  105. final Canvas canvas = sCanvas;
  106. canvas.setBitmap(thumb);
  107. sOldBounds.set(icon.getBounds());
  108. final int x = (width - iconWidth) / 2;
  109. final int y = (height - iconHeight) / 2;
  110. icon.setBounds(x, y, x + iconWidth, y + iconHeight);
  111. icon.draw(canvas);
  112. icon.setBounds(sOldBounds);
  113. icon = new FastBitmapDrawable(thumb);
  114. }
  115. }
  116. return icon;
  117. }
  118. /**
  119. * Returns a Bitmap representing the thumbnail of the specified Bitmap.
  120. * The size of the thumbnail is defined by the dimension
  121. * android.R.dimen.launcher_application_icon_size.
  122. *
  123. * This method is not thread-safe and should be invoked on the UI thread only.
  124. *
  125. * @param bitmap The bitmap to get a thumbnail of.
  126. * @param context The application's context.
  127. *
  128. * @return A thumbnail for the specified bitmap or the bitmap itself if the
  129. *         thumbnail could not be created.
  130. */
  131. static Bitmap createBitmapThumbnail(Bitmap bitmap, Context context) {
  132. if (sIconWidth == -1) {
  133. final Resources resources = context.getResources();
  134. sIconWidth = sIconHeight = (int) resources.getDimension(
  135. android.R.dimen.app_icon_size);
  136. }
  137. int width = sIconWidth;
  138. int height = sIconHeight;
  139. final int bitmapWidth = bitmap.getWidth();
  140. final int bitmapHeight = bitmap.getHeight();
  141. if (width > 0 && height > 0) {
  142. if (width < bitmapWidth || height < bitmapHeight) {
  143. final float ratio = (float) bitmapWidth / bitmapHeight;
  144. if (bitmapWidth > bitmapHeight) {
  145. height = (int) (width / ratio);
  146. } else if (bitmapHeight > bitmapWidth) {
  147. width = (int) (height * ratio);
  148. }
  149. final Bitmap.Config c = (width == sIconWidth && height == sIconHeight) ?
  150. bitmap.getConfig() : Bitmap.Config.ARGB_8888;
  151. final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
  152. final Canvas canvas = sCanvas;
  153. final Paint paint = sPaint;
  154. canvas.setBitmap(thumb);
  155. paint.setDither(false);
  156. paint.setFilterBitmap(true);
  157. sBounds.set((sIconWidth - width) / 2, (sIconHeight - height) / 2, width, height);
  158. sOldBounds.set(0, 0, bitmapWidth, bitmapHeight);
  159. canvas.drawBitmap(bitmap, sOldBounds, sBounds, paint);
  160. return thumb;
  161. } else if (bitmapWidth < width || bitmapHeight < height) {
  162. final Bitmap.Config c = Bitmap.Config.ARGB_8888;
  163. final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
  164. final Canvas canvas = sCanvas;
  165. final Paint paint = sPaint;
  166. canvas.setBitmap(thumb);
  167. paint.setDither(false);
  168. paint.setFilterBitmap(true);
  169. canvas.drawBitmap(bitmap, (sIconWidth - bitmapWidth) / 2,
  170. (sIconHeight - bitmapHeight) / 2, paint);
  171. return thumb;
  172. }
  173. }
  174. return bitmap;
  175. }
  176. }
  1. //Android Matrix类实现镜像方法
  2. public void drawRegion(Image image_src,
  3. int x_src, int y_src,
  4. int width, int height,
  5. int transform,
  6. int x_dest, int y_dest,
  7. int anchor){
  8. if((anchor&VCENTER) != 0){
  9. y_dest -= height/2;
  10. }else if((anchor&BOTTOM) != 0){
  11. y_dest -= height;
  12. }
  13. if((anchor&RIGHT) != 0){
  14. x_dest -= width;
  15. }else if((anchor&HCENTER) != 0){
  16. x_dest -= width/2;
  17. }
  18. Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height);
  19. Matrix mMatrix = new Matrix();
  20. Matrix temp = new Matrix();
  21. Matrix temp2 = new Matrix();
  22. float[] mirrorY = {
  23. -1, 0, 0,
  24. 0, 1, 0,
  25. 0, 0, 1
  26. };
  27. temp.setValues(mirrorY);
  28. switch(transform){
  29. case Sprite.TRANS_NONE:
  30. break;
  31. case Sprite.TRANS_ROT90:
  32. mMatrix.setRotate(90,width/2, height/2);
  33. break;
  34. case Sprite.TRANS_ROT180:
  35. mMatrix.setRotate(180,width/2, height/2);
  36. break;
  37. case Sprite.TRANS_ROT270:
  38. mMatrix.setRotate(270,width/2, height/2);
  39. break;
  40. case Sprite.TRANS_MIRROR:
  41. mMatrix.postConcat(temp);
  42. break;
  43. case Sprite.TRANS_MIRROR_ROT90:
  44. mMatrix.postConcat(temp);
  45. mMatrix.setRotate(90,width/2, height/2);
  46. break;
  47. case Sprite.TRANS_MIRROR_ROT180:
  48. mMatrix.postConcat(temp);
  49. mMatrix.setRotate(180,width/2, height/2);
  50. break;
  51. case Sprite.TRANS_MIRROR_ROT270:
  52. mMatrix.postConcat(temp);
  53. mMatrix.setRotate(270,width/2, height/2);
  54. break;
  55. }
  56. mMatrix.setTranslate(x_dest, y_dest);
  57. canvas.drawBitmap(newMap, mMatrix, mPaint);
  58. }
  1. //图片Url保存为位图并进行缩放操作
  2. //通过传入图片url获取位图方法
  3. public Bitmap returnBitMap(String url) {
  4. URL myFileUrl = null;
  5. Bitmap bitmap = null;
  6. try {
  7. myFileUrl = new URL(url);
  8. } catch (MalformedURLException e) {
  9. e.printStackTrace();
  10. }
  11. try {
  12. HttpURLConnection conn = (HttpURLConnection) myFileUrl
  13. .openConnection();
  14. conn.setDoInput(true);
  15. conn.connect();
  16. InputStream is = conn.getInputStream();
  17. bitmap = BitmapFactory.decodeStream(is);
  18. is.close();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. Log.v(tag, bitmap.toString());
  23. return bitmap;
  24. }
  25. //通过传入位图,新的宽.高比进行位图的缩放操作
  26. public static Drawable resizeImage(Bitmap bitmap, int w, int h) {
  27. // load the origial Bitmap
  28. Bitmap BitmapOrg = bitmap;
  29. int width = BitmapOrg.getWidth();
  30. int height = BitmapOrg.getHeight();
  31. int newWidth = w;
  32. int newHeight = h;
  33. Log.v(tag, String.valueOf(width));
  34. Log.v(tag, String.valueOf(height));
  35. Log.v(tag, String.valueOf(newWidth));
  36. Log.v(tag, String.valueOf(newHeight));
  37. // calculate the scale
  38. float scaleWidth = ((float) newWidth) / width;
  39. float scaleHeight = ((float) newHeight) / height;
  40. // create a matrix for the manipulation
  41. Matrix matrix = new Matrix();
  42. // resize the Bitmap
  43. matrix.postScale(scaleWidth, scaleHeight);
  44. // if you want to rotate the Bitmap
  45. // matrix.postRotate(45);
  46. // recreate the new Bitmap
  47. Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width,
  48. height, matrix, true);
  49. // make a Drawable from Bitmap to allow to set the Bitmap
  50. // to the ImageView, ImageButton or what ever
  51. return new BitmapDrawable(resizedBitmap);
  52. }
  1. 1.图片加载方法,方便用户加载图片
  2. /***
  3. * 加载本地图片
  4. * @param context:主运行函数实例
  5. * @param bitAdress:图片地址,一般指向R下的drawable目录
  6. * @return
  7. */
  8. public final Bitmap CreatImage(Context context, int bitAdress) {
  9. Bitmap bitmaptemp = null;
  10. bitmaptemp = BitmapFactory.decodeResource(context.getResources(),
  11. bitAdress);
  12. return bitmaptemp;
  13. }
  14. 2.图片平均分割方法,将大图平均分割为N行N列,方便用户使用
  15. /***
  16. * 图片分割
  17. *
  18. * @param g
  19. * :画布
  20. * @param paint
  21. * :画笔
  22. * @param imgBit
  23. * :图片
  24. * @param x
  25. * :X轴起点坐标
  26. * @param y
  27. * :Y轴起点坐标
  28. * @param w
  29. * :单一图片的宽度
  30. * @param h
  31. * :单一图片的高度
  32. * @param line
  33. * :第几列
  34. * @param row
  35. * :第几行
  36. */
  37. public final void cuteImage(Canvas g, Paint paint, Bitmap imgBit, int x,
  38. int y, int w, int h, int line, int row) {
  39. g.clipRect(x, y, x + w, h + y);
  40. g.drawBitmap(imgBit, x – line * w, y – row * h, paint);
  41. g.restore();
  42. }
  43. 3.图片缩放,对当前图片进行缩放处理
  44. /***
  45. * 图片的缩放方法
  46. *
  47. * @param bgimage
  48. * :源图片资源
  49. * @param newWidth
  50. * :缩放后宽度
  51. * @param newHeight
  52. * :缩放后高度
  53. * @return
  54. */
  55. public Bitmap zoomImage(Bitmap bgimage, int newWidth, int newHeight) {
  56. // 获取这个图片的宽和高
  57. int width = bgimage.getWidth();
  58. int height = bgimage.getHeight();
  59. // 创建操作图片用的matrix对象
  60. Matrix matrix = new Matrix();
  61. // 计算缩放率,新尺寸除原始尺寸
  62. float scaleWidth = ((float) newWidth) / width;
  63. float scaleHeight = ((float) newHeight) / height;
  64. // 缩放图片动作
  65. matrix.postScale(scaleWidth, scaleHeight);
  66. Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, width, height,
  67. matrix, true);
  68. return bitmap;
  69. }
  70. 4.绘制带有边框的文字,一般在游戏中起文字的美化作用
  71. /***
  72. * 绘制带有边框的文字
  73. *
  74. * @param strMsg
  75. * :绘制内容
  76. * @param g
  77. * :画布
  78. * @param paint
  79. * :画笔
  80. * @param setx
  81. * ::X轴起始坐标
  82. * @param sety
  83. * :Y轴的起始坐标
  84. * @param fg
  85. * :前景色
  86. * @param bg
  87. * :背景色
  88. */
  89. public void drawText(String strMsg, Canvas g, Paint paint, int setx,
  90. int sety, int fg, int bg) {
  91. paint.setColor(bg);
  92. g.drawText(strMsg, setx + 1, sety, paint);
  93. g.drawText(strMsg, setx, sety – 1, paint);
  94. g.drawText(strMsg, setx, sety + 1, paint);
  95. g.drawText(strMsg, setx – 1, sety, paint);
  96. paint.setColor(fg);
  97. g.drawText(strMsg, setx, sety, paint);
  98. g.restore();
  99. }
  100. 5.Android 图片透明度处理代码
  101. /**
  102. * 图片透明度处理
  103. *
  104. * @param sourceImg
  105. *            原始图片
  106. * @param number
  107. *            透明度
  108. * @return
  109. */
  110. public static Bitmap setAlpha(Bitmap sourceImg, int number) {
  111. int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()];
  112. sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 0, 0,sourceImg.getWidth(), sourceImg.getHeight());// 获得图片的ARGB值
  113. number = number * 255 / 100;
  114. for (int i = 0; i < argb.length; i++) {
  115. argb = (number << 24) | (argb & 0×00FFFFFF);// 修改最高2位的值
  116. }
  117. sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888);
  118. return sourceImg;
  119. }
  120. 6.图片翻转
  121. Resources res = this.getContext().getResources();
  122. img = BitmapFactory.decodeResource(res, R.drawable.slogo);
  123. Matrix matrix = new Matrix();
  124. matrix.postRotate(90);        /*翻转90度*/
  125. int width = img.getWidth();
  126. int height = img.getHeight();
  127. r_img = Bitmap.createBitmap(img, 0, 0, width, height, matrix, true);
  1. import android.graphics.Bitmap;
  2. import android.graphics.Canvas;
  3. import android.graphics.LinearGradient;
  4. import android.graphics.Matrix;
  5. import android.graphics.Paint;
  6. import android.graphics.PixelFormat;
  7. import android.graphics.PorterDuffXfermode;
  8. import android.graphics.Rect;
  9. import android.graphics.RectF;
  10. import android.graphics.Bitmap.Config;
  11. import android.graphics.PorterDuff.Mode;
  12. import android.graphics.Shader.TileMode;
  13. import android.graphics.drawable.Drawable;
  14. /**
  15. *
  16. * @author superdev
  17. * @version 1.0
  18. *
  19. */
  20. public class ImageUtil {
  21. /**
  22. * 放大缩小图片
  23. */
  24. public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
  25. int width = bitmap.getWidth();
  26. int height = bitmap.getHeight();
  27. Matrix matrix = new Matrix();
  28. float scaleWidht = ((float) w / width);
  29. float scaleHeight = ((float) h / height);
  30. matrix.postScale(scaleWidht, scaleHeight);
  31. Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
  32. return newbmp;
  33. }
  34. /**
  35. * 将Drawable转化为Bitmap
  36. */
  37. public static Bitmap drawableToBitmap(Drawable drawable) {
  38. int width = drawable.getIntrinsicWidth();
  39. int height = drawable.getIntrinsicHeight();
  40. Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
  41. Canvas canvas = new Canvas(bitmap);
  42. drawable.setBounds(0, 0, width, height);
  43. drawable.draw(canvas);
  44. return bitmap;
  45. }
  46. /**
  47. * 获得圆角图片的方法
  48. */
  49. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
  50. Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
  51. Canvas canvas = new Canvas(output);
  52. final int color = 0xff424242;
  53. final Paint paint = new Paint();
  54. final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
  55. final RectF rectF = new RectF(rect);
  56. paint.setAntiAlias(true);
  57. canvas.drawARGB(0, 0, 0, 0);
  58. paint.setColor(color);
  59. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
  60. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  61. canvas.drawBitmap(bitmap, rect, rect, paint);
  62. return output;
  63. }
  64. /**
  65. * 获得带倒影的图片方法
  66. */
  67. public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
  68. final int reflectionGap = 4;
  69. int width = bitmap.getWidth();
  70. int height = bitmap.getHeight();
  71. Matrix matrix = new Matrix();
  72. matrix.preScale(1, -1);
  73. Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2, width, height / 2, matrix, false);
  74. Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888);
  75. Canvas canvas = new Canvas(bitmapWithReflection);
  76. canvas.drawBitmap(bitmap, 0, 0, null);
  77. Paint deafalutPaint = new Paint();
  78. canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);
  79. canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
  80. Paint paint = new Paint();
  81. LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
  82. paint.setShader(shader);
  83. // Set the Transfer mode to be porter duff and destination in
  84. paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
  85. // Draw a rectangle using the paint with our linear gradient
  86. canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);
  87. return bitmapWithReflection;
  88. }
  89. }
  1. private byte[] Bitmap2Bytes(Bitmap bm){
  2. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  3. bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
  4. return baos.toByteArray();
  5. }
  6. private Bitmap Bytes2Bimap(byte[] b){
  7. if(b.length!=0){
  8. return BitmapFactory.decodeByteArray(b, 0, b.length);
  9. }
  10. else {
  11. return null;
  12. }
  13. }
  14. /**
  15. * create the bitmap from a byte array
  16. *生成水印图片
  17. * @param src the bitmap object you want proecss
  18. * @param watermark the water mark above the src
  19. * @return return a bitmap object ,if paramter's length is 0,return null
  20. */
  21. private Bitmap createBitmap( Bitmap src, Bitmap watermark )
  22. {
  23. String tag = "createBitmap";
  24. Log.d( tag, "create a new bitmap" );
  25. if( src == null )
  26. {
  27. return null;
  28. }
  29. int w = src.getWidth();
  30. int h = src.getHeight();
  31. int ww = watermark.getWidth();
  32. int wh = watermark.getHeight();
  33. //create the new blank bitmap
  34. Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个新的和SRC长度宽度一样的位图
  35. Canvas cv = new Canvas( newb );
  36. //draw src into
  37. cv.drawBitmap( src, 0, 0, null );//在 0,0坐标开始画入src
  38. //draw watermark into
  39. cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印
  40. //save all clip
  41. cv.save( Canvas.ALL_SAVE_FLAG );//保存
  42. //store
  43. cv.restore();//存储
  44. return newb;
  45. }
  46. /** 重新编码Bitmap
  47. *
  48. * @param src
  49. *          需要重新编码的Bitmap
  50. *
  51. * @param format
  52. *          编码后的格式(目前只支持png和jpeg这两种格式)
  53. *
  54. * @param quality
  55. *          重新生成后的bitmap的质量
  56. *
  57. * @return
  58. *          返回重新生成后的bitmap
  59. */
  60. private static Bitmap codec(Bitmap src, Bitmap.CompressFormat format,
  61. int quality) {
  62. ByteArrayOutputStream os = new ByteArrayOutputStream();
  63. src.compress(format, quality, os);
  64. byte[] array = os.toByteArray();
  65. return BitmapFactory.decodeByteArray(array, 0, array.length);
  66. }
  67. //Stream转换成Byte
  68. static byte[] streamToBytes(InputStream is) {
  69. ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
  70. byte[] buffer = new byte[1024];
  71. int len;
  72. try {
  73. while ((len = is.read(buffer)) >= 0) {
  74. os.write(buffer, 0, len);
  75. }
  76. } catch (java.io.IOException e) {
  77. }
  78. return os.toByteArray();
  79. }
  80. //把View转换成Bitmap
  81. /**
  82. * 把一个View的对象转换成bitmap
  83. */
  84. static Bitmap getViewBitmap(View v) {
  85. v.clearFocus();
  86. v.setPressed(false);
  87. //能画缓存就返回false
  88. boolean willNotCache = v.willNotCacheDrawing();
  89. v.setWillNotCacheDrawing(false);
  90. int color = v.getDrawingCacheBackgroundColor();
  91. v.setDrawingCacheBackgroundColor(0);
  92. if (color != 0) {
  93. v.destroyDrawingCache();
  94. }
  95. v.buildDrawingCache();
  96. Bitmap cacheBitmap = v.getDrawingCache();
  97. if (cacheBitmap == null) {
  98. Log.e(TAG, "failed getViewBitmap(" + v + ")", new RuntimeException());
  99. return null;
  100. }
  101. Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
  102. // Restore the view
  103. v.destroyDrawingCache();
  104. v.setWillNotCacheDrawing(willNotCache);
  105. v.setDrawingCacheBackgroundColor(color);
  106. return bitmap;
  107. }
  1. 读取raw资源文件中的mp3文件,然后通过音乐播放器播放:
  2. /**
  3. * 把mp3文件写入卡
  4. *
  5. * @param fileName
  6. *             输出的文件名(全路径)
  7. * @param context
  8. *             context对象
  9. */
  10. private void writeMP3ToSDcard(String fileName, Context context) {
  11. byte[] buffer = new byte[1024 * 8];
  12. int read;
  13. BufferedInputStream bin = new BufferedInputStream(context.getResources().openRawResource(R.raw.ring));
  14. try {
  15. BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(fileName));
  16. while ((read = bin.read(buffer)) > -1) {
  17. bout.write(buffer, 0, read);
  18. }
  19. bout.flush();
  20. bout.close();
  21. bin.close();
  22. } catch (FileNotFoundException e) {
  23. e.printStackTrace();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. Intent intent = new Intent();
  29. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  30. intent.setAction(android.content.Intent.ACTION_VIEW);
  31. intent.setDataAndType(Uri.fromFile(newFile("XXXXmp3的文件全路径")),"audio/*");
  32. startActivity(intent);

绘制图像倒影

  1. private void
  2. _Init()
  3. {
  4. m_paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  5. LinearGradient lg = new LinearGradient(
  6. 0, 0, 0, m_nShadowH,
  7. 0xB0FFFFFF, 0x00000000,
  8. Shader.TileMode.CLAMP);
  9. m_paint.setShader(lg);
  10. m_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
  11. }
  12. @Override protected void
  13. onDraw(Canvas canvas)
  14. {
  15. super.onDraw(canvas);
  16. int nX = 0;
  17. int nY = 20;
  18. _DrawNormalImg(canvas, nX, nY);
  19. _DrawMirror(canvas, nX, nY);
  20. }
  21. private void
  22. _DrawNormalImg(Canvas canvas, int nX, int nY)
  23. {
  24. canvas.save(Canvas.MATRIX_SAVE_FLAG);
  25. canvas.translate(nX, nY);
  26. m_dw.draw(canvas);
  27. canvas.restore();
  28. }
  29. private void
  30. _DrawMirror(Canvas canvas, int nX, int nY)
  31. {
  32. int nW = m_dw.getIntrinsicWidth();
  33. int nH = m_dw.getIntrinsicHeight();
  34. ///////////////////////////////////
  35. //draw mirror image
  36. canvas.save(Canvas.MATRIX_SAVE_FLAG);
  37. canvas.scale(1.0f, -1.0f);
  38. canvas.translate(nX, -(nY + nH * 2));
  39. canvas.clipRect(0, nH, nW, nH - m_nShadowH);
  40. m_dw.draw(canvas);
  41. canvas.restore();
  42. //////////////////////////////
  43. //draw mask
  44. canvas.save();
  45. canvas.translate(nX, nY + nH);
  46. canvas.drawRect(0, 0, nW, m_nShadowH, m_paint);
  47. canvas.restore();
  48. }

Android 繪圖座標體系預設的原點在左上角,X 軸往右是越來越大的正值,而 Y 軸往下,則是越來越大的正值。要畫出垂直翻轉的圖片,其實也就是要垂直翻轉整個繪圖座標體系。在 Android 中,要如何做?答案就是 canvas.scale(1.0f, -1.0f)。很簡單吧,沒想到給 scale() 函式一個負值,就可以翻轉相對應的軸。 
在 Photoshop 中,做鏡像特效的第二步是要對這翻轉的圖片,加個由灰到黑的漸層 mask。 
在 Android 中,要畫漸層色,那就一定得用 LinearGradient 這個類別。至於要對背景圖加上個 mask,就請參考一下 Paint 的 setXfermode() 函式。_Init() 這個函式,就是負責生成一個由灰到黑漸層 mask 的 m_paint 物件。

android图片处理方法(转)

http://blog.csdn.net/Android_Tutor/archive/2010/11/02/5981753.aspx

http://www.cnblogs.com/TerryBlog/archive/2012/01/08/2316482.html

android常用图片特效处理 
http://www.eoeandroid.com/thread-170526-1-1.html

相机(Camera)实时滤镜效果 
http://www.eoeandroid.com/thread-171528-1-1.html

Android, WindowsPhone7, IOS ,vc2010平台40多套图片滤镜开源 
http://www.cnblogs.com/daizhj/archive/2012/05/15/2501406.html

Android实现获取本机中所有图片 
http://www.cnblogs.com/hanyonglu/archive/2012/05/10/2494908.html

上一篇:[HihoCoder1369]网络流一·Ford-Fulkerson算法


下一篇:Android scrollview嵌套webview滑动冲突的解决方案