将一个图片切割成多个图片
有种场景,我们想将一个图片切割成多个图片。比如我们在开发一个拼图的游戏,就首先要对图片进行切割。
以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。
一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量。
1. importandroid.graphics.Bitmap;
2. publicclassImagePiece {
3. publicintindex = 0;
4. publicBitmap bitmap = null;
5. }
一个是ImageSplitter类,有一个静态方法split,传入的参数是要切割的Bitmap对象,和横向和竖向的切割片数。比如传入的是3、3,则横竖向都切割成3片,最终会将整个图片切割成3X3=9片。
1. importjava.util.ArrayList;
2. importjava.util.List;
3.
4. importandroid.graphics.Bitmap;
5.
6. publicclassImageSplitter {
7.
8. publicstaticList<ImagePiece> split(Bitmap bitmap, intxPiece, intyPiece) {
9.
10. List<ImagePiece> pieces = newArrayList<ImagePiece>(xPiece * yPiece);
11. intwidth = bitmap.getWidth();
12. intheight = bitmap.getHeight();
13. intpieceWidth = width / 3;
14. intpieceHeight = height / 3;
15. for(inti = 0; i < yPiece; i++) {
16. for(intj = 0; j < xPiece; j++) {
17. ImagePiece piece = newImagePiece();
18. piece.index = j + i * xPiece;
19. intxValue = j * pieceWidth;
20. intyValue = i * pieceHeight;
21. piece.bitmap = Bitmap.createBitmap(bitmap, xValue, yValue,
22. pieceWidth, pieceHeight);
23. pieces.add(piece);
24. }
25. }
26.
27. returnpieces;
28. }
29.
30. }
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 = newColorMatrix();
6. cm.setSaturation(0);
7. ColorMatrixColorFilter cf = newColorMatrixColorFilter(cm);
8. mDrawable.setColorFilter(cf);
生成缩略图,抠自android launcher源码:
1.
2.
3. packagecom.android.launcher;
4.
5. importandroid.graphics.drawable.BitmapDrawable;
6. importandroid.graphics.drawable.Drawable;
7. importandroid.graphics.drawable.PaintDrawable;
8. importandroid.graphics.Bitmap;
9. importandroid.graphics.PixelFormat;
10. importandroid.graphics.Canvas;
11. importandroid.graphics.PaintFlagsDrawFilter;
12. importandroid.graphics.Paint;
13. importandroid.graphics.Rect;
14. importandroid.content.res.Resources;
15. importandroid.content.Context;
16.
17.
18. finalclassUtilities {
19. privatestaticintsIconWidth = -1;
20. privatestaticintsIconHeight = -1;
21.
22. privatestaticfinalPaint sPaint = newPaint();
23. privatestaticfinalRect sBounds = newRect();
24. privatestaticfinalRect sOldBounds = newRect();
25. privatestaticCanvas sCanvas = newCanvas();
26.
27. static{
28. sCanvas.setDrawFilter(newPaintFlagsDrawFilter(Paint.DITHER_FLAG,
29. Paint.FILTER_BITMAP_FLAG));
30. }
31.
32.
33. staticDrawable createIconThumbnail(Drawable icon, Context context) {
34. if(sIconWidth == -1) {
35. finalResources resources = context.getResources();
36. sIconWidth = sIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size);
37. }
38.
39. intwidth = sIconWidth;
40. intheight = sIconHeight;
41.
42. floatscale = 1.0f;
43. if(icon instanceofPaintDrawable) {
44. PaintDrawable painter = (PaintDrawable) icon;
45. painter.setIntrinsicWidth(width);
46. painter.setIntrinsicHeight(height);
47. } elseif(icon instanceofBitmapDrawable) {
48. // Ensure the bitmap has a density.
49. BitmapDrawable bitmapDrawable = (BitmapDrawable) icon;
50. Bitmap bitmap = bitmapDrawable.getBitmap();
51. if(bitmap.getDensity() == Bitmap.DENSITY_NONE) {
52. bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics());
53. }
54. }
55. inticonWidth = icon.getIntrinsicWidth();
56. inticonHeight = icon.getIntrinsicHeight();
57.
58. if(width > 0&& height > 0) {
59. if(width < iconWidth || height < iconHeight || scale != 1.0f) {
60. finalfloatratio = (float) iconWidth / iconHeight;
61.
62. if(iconWidth > iconHeight) {
63. height = (int) (width / ratio);
64. } elseif(iconHeight > iconWidth) {
65. width = (int) (height * ratio);
66. }
67.
68. finalBitmap.Config c = icon.getOpacity() != PixelFormat.OPAQUE ?
69. Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
70. finalBitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
71. finalCanvas canvas = sCanvas;
72. canvas.setBitmap(thumb);
73. // Copy the old bounds to restore them later
74. // If we were to do oldBounds = icon.getBounds(),
75. // the call to setBounds() that follows would
76. // change the same instance and we would lose the
77. // old bounds
78. sOldBounds.set(icon.getBounds());
79. finalintx = (sIconWidth - width) / 2;
80. finalinty = (sIconHeight - height) / 2;
81. icon.setBounds(x, y, x + width, y + height);
82. icon.draw(canvas);
83. icon.setBounds(sOldBounds);
84. icon = newFastBitmapDrawable(thumb);
85. } elseif(iconWidth < width && iconHeight < height) {
86. finalBitmap.Config c = Bitmap.Config.ARGB_8888;
87. finalBitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
88. finalCanvas canvas = sCanvas;
89. canvas.setBitmap(thumb);
90. sOldBounds.set(icon.getBounds());
91. finalintx = (width - iconWidth) / 2;
92. finalinty = (height - iconHeight) / 2;
93. icon.setBounds(x, y, x + iconWidth, y + iconHeight);
94. icon.draw(canvas);
95. icon.setBounds(sOldBounds);
96. icon = newFastBitmapDrawable(thumb);
97. }
98. }
99.
100. returnicon;
101. }
102.
103.
104. staticBitmap createBitmapThumbnail(Bitmap bitmap, Context context) {
105. if(sIconWidth == -1) {
106. finalResources resources = context.getResources();
107. sIconWidth = sIconHeight = (int) resources.getDimension(
108. android.R.dimen.app_icon_size);
109. }
110.
111. intwidth = sIconWidth;
112. intheight = sIconHeight;
113.
114. finalintbitmapWidth = bitmap.getWidth();
115. finalintbitmapHeight = bitmap.getHeight();
116.
117. if(width > 0&& height > 0) {
118. if(width < bitmapWidth || height < bitmapHeight) {
119. finalfloatratio = (float) bitmapWidth / bitmapHeight;
120.
121. if(bitmapWidth > bitmapHeight) {
122. height = (int) (width / ratio);
123. } elseif(bitmapHeight > bitmapWidth) {
124. width = (int) (height * ratio);
125. }
126.
127. finalBitmap.Config c = (width == sIconWidth && height == sIconHeight) ?
128. bitmap.getConfig() : Bitmap.Config.ARGB_8888;
129. finalBitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
130. finalCanvas canvas = sCanvas;
131. finalPaint paint = sPaint;
132. canvas.setBitmap(thumb);
133. paint.setDither(false);
134. paint.setFilterBitmap(true);
135. sBounds.set((sIconWidth - width) / 2, (sIconHeight - height) / 2, width, height);
136. sOldBounds.set(0, 0, bitmapWidth, bitmapHeight);
137. canvas.drawBitmap(bitmap, sOldBounds, sBounds, paint);
138. returnthumb;
139. } elseif(bitmapWidth < width || bitmapHeight < height) {
140. finalBitmap.Config c = Bitmap.Config.ARGB_8888;
141. finalBitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
142. finalCanvas canvas = sCanvas;
143. finalPaint paint = sPaint;
144. canvas.setBitmap(thumb);
145. paint.setDither(false);
146. paint.setFilterBitmap(true);
147. canvas.drawBitmap(bitmap, (sIconWidth - bitmapWidth) / 2,
148. (sIconHeight - bitmapHeight) / 2, paint);
149. returnthumb;
150. }
151. }
152.
153. returnbitmap;
154. }
155. }