/**
* 将多个Bitmap合并成一个图片。
*
* @param int 将多个图合成多少列
* @param Bitmap... 要合成的图片
* @return
*/
public static Bitmap combineBitmaps(int columns, Bitmap... bitmaps) {
if (columns <= 0 || bitmaps == null || bitmaps.length == 0) {
throw new IllegalArgumentException("Wrong parameters: columns must > 0 and bitmaps.length must > 0.");
}
int maxWidthPerImage = 0;
int maxHeightPerImage = 0;
for (Bitmap b : bitmaps) {
maxWidthPerImage = maxWidthPerImage > b.getWidth() ? maxWidthPerImage : b.getWidth();
maxHeightPerImage = maxHeightPerImage > b.getHeight() ? maxHeightPerImage : b.getHeight();
}
int rows = 0;
if (columns >= bitmaps.length) {
rows = 1;
columns = bitmaps.length;
} else {
rows = bitmaps.length % columns == 0 ? bitmaps.length / columns : bitmaps.length / columns + 1;
}
Bitmap newBitmap = Bitmap.createBitmap(columns * maxWidthPerImage, rows * maxHeightPerImage, Config.RGB_565);
for (int x = 0; x < rows; x++) {
for (int y = 0; y < columns; y++) {
int index = x * columns + y;
if (index >= bitmaps.length)
break;
newBitmap = mixtureBitmap(newBitmap, bitmaps[index], new PointF(y * maxWidthPerImage, x * maxHeightPerImage));
}
}
return newBitmap;
}
/**
* Mix two Bitmap as one.
*
* @param bitmapOne
* @param bitmapTwo
* @param point
* where the second bitmap is painted.
* @return
*/
public static Bitmap mixtureBitmap(Bitmap first, Bitmap second, PointF fromPoint) {
if (first == null || second == null || fromPoint == null) {
return null;
}
Bitmap newBitmap = Bitmap.createBitmap(first.getWidth(), first.getHeight(), Config.ARGB_4444);
Canvas cv = new Canvas(newBitmap);
cv.drawBitmap(first, 0, 0, null);
cv.drawBitmap(second, fromPoint.x, fromPoint.y, null);
cv.save(Canvas.ALL_SAVE_FLAG);
cv.restore();
return newBitmap;
}
//截屏
public static Bitmap getScreenshotsForCurrentWindow(Activity activity) {
View cv = activity.getWindow().getDecorView();
Bitmap bmp = Bitmap.createBitmap(cv.getWidth(), cv.getHeight(), Bitmap.Config.ARGB_4444);
cv.draw(new Canvas(bmp));
return bmp;
}
//旋转图片
// Rotates the bitmap by the specified degree.
// If a new bitmap is created, the original bitmap is recycled.
public static Bitmap rotate(Bitmap b, int degrees) {
if (degrees != 0 && b != null) {
Matrix m = new Matrix();
m.setRotate(degrees, (float) b.getWidth() / 2, (float) b.getHeight() / 2);
try {
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true);
if (b != b2) {
b.recycle();
b = b2;
}
} catch (OutOfMemoryError ex) {
// We have no memory to rotate. Return the original bitmap.
}
}
return b;
}
//可用于生成缩略图。
/**
* Creates a centered bitmap of the desired size. Recycles the input.
*
* @param source
*/
public static Bitmap extractMiniThumb(Bitmap source, int width, int height) {
return extractMiniThumb(source, width, height, true);
}
public static Bitmap extractMiniThumb(Bitmap source, int width, int height, boolean recycle) {
if (source == null) {
return null;
}
float scale;
if (source.getWidth() < source.getHeight()) {
scale = width / (float) source.getWidth();
} else {
scale = height / (float) source.getHeight();
}
Matrix matrix = new Matrix();
matrix.setScale(scale, scale);
Bitmap miniThumbnail = transform(matrix, source, width, height, false);
if (recycle && miniThumbnail != source) {
source.recycle();
}
return miniThumbnail;
}
public static Bitmap transform(Matrix scaler, Bitmap source, int targetWidth, int targetHeight, boolean scaleUp) {
int deltaX = source.getWidth() - targetWidth;
int deltaY = source.getHeight() - targetHeight;
if (!scaleUp && (deltaX < 0 || deltaY < 0)) {
/*
* In this case the bitmap is smaller, at least in one dimension,
* than the target. Transform it by placing as much of the image as
* possible into the target and leaving the top/bottom or left/right
* (or both) black.
*/
Bitmap b2 = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b2);
int deltaXHalf = Math.max(0, deltaX / 2);
int deltaYHalf = Math.max(0, deltaY / 2);
Rect src = new Rect(deltaXHalf, deltaYHalf, deltaXHalf + Math.min(targetWidth, source.getWidth()), deltaYHalf
+ Math.min(targetHeight, source.getHeight()));
int dstX = (targetWidth - src.width()) / 2;
int dstY = (targetHeight - src.height()) / 2;
Rect dst = new Rect(dstX, dstY, targetWidth - dstX, targetHeight - dstY);
c.drawBitmap(source, src, dst, null);
return b2;
}
float bitmapWidthF = source.getWidth();
float bitmapHeightF = source.getHeight();
float bitmapAspect = bitmapWidthF / bitmapHeightF;
float viewAspect = (float) targetWidth / targetHeight;
if (bitmapAspect > viewAspect) {
float scale = targetHeight / bitmapHeightF;
if (scale < .9F || scale > 1F) {
scaler.setScale(scale, scale);
} else {
scaler = null;
}
} else {
float scale = targetWidth / bitmapWidthF;
if (scale < .9F || scale > 1F) {
scaler.setScale(scale, scale);
} else {
scaler = null;
}
}
Bitmap b1;
if (scaler != null) {
// this is used for minithumb and crop, so we want to filter here.
b1 = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), scaler, true);
} else {
b1 = source;
}
int dx1 = Math.max(0, b1.getWidth() - targetWidth);
int dy1 = Math.max(0, b1.getHeight() - targetHeight);
Bitmap b2 = Bitmap.createBitmap(b1, dx1 / 2, dy1 / 2, targetWidth, targetHeight);
if (b1 != source) {
b1.recycle();
}
return b2;
}
//图片剪切
public static Bitmap cutBitmap(Bitmap mBitmap, Rect r, Bitmap.Config config) {
int width = r.width();
int height = r.height();
Bitmap croppedImage = Bitmap.createBitmap(width, height, config);
Canvas cvs = new Canvas(croppedImage);
Rect dr = new Rect(0, 0, width, height);
cvs.drawBitmap(mBitmap, r, dr, null);
return croppedImage;
}
//从任一Drawable得到Bitmap
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
/**
* Save Bitmap to a file.保存图片到SD卡。
*
* @param bitmap
* @param file
* @return error message if the saving is failed. null if the saving is
* successful.
* @throws IOException
*/
public static void saveBitmapToFile(Bitmap bitmap, String _file) throws IOException {
BufferedOutputStream os = null;
try {
File file = new File(_file);
// String _filePath_file.replace(File.separatorChar +
// file.getName(), "");
int end = _file.lastIndexOf(File.separator);
String _filePath = _file.substring(0, end);
File filePath = new File(_filePath);
if (!filePath.exists()) {
filePath.mkdirs();
}
file.createNewFile();
os = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
Log.e(TAG_ERROR, e.getMessage(), e);
}
}
}
}
分享到:
相关推荐
在Android开发中,Bitmap是用于表示图像数据的基本对象,它是一种内存中的图片表示形式。而当我们需要在应用程序中展示带有圆角的图片时,通常会用到Bitmap的处理技巧。本篇文章将深入探讨如何在Android中对Bitmap...
切割图片通常指的是从原始图片中提取出一个矩形区域,这个操作在Android中可以通过Bitmap.createBitmap方法实现。以下是一个简单的示例,展示如何从Bitmap中裁剪出指定大小和位置的子Bitmap: ```java // 原始...
- **本地存储**:将Bitmap转换为String,可以方便地保存在SharedPreferences或数据库中,节省空间并简化操作。 - **分享功能**:当分享图片时,可以将Bitmap转换为String,然后嵌入到分享链接的HTML中。 提供的`...
我就废话不多说了,大家还是直接看代码吧~ //Uri.parse(file://+result.getImage... //方法一:通过uri把图片转化为bitmap的方法 Bitmap bitmap= BitmapFactory.decodeFile(path); int height= bitmap.get
在Android开发中,有时我们需要将Bitmap对象转换成不同的图片格式,比如BMP。BMP(Bitmap File Format)是一种常见的位图文件格式,但它并不像JPEG或PNG那样被Android SDK直接支持。本文将详细介绍如何在Android中将...
总之,"android Tif Tiff格式的图片转换成bitmap 读取TIFF传真格式图片DEMO下载"这个资源提供了一个实用的方法,帮助开发者在Android应用中处理TIF/TIFF格式的图像,通过SeeTiff库实现图片的读取和转换,让Android...
本篇文章将深入探讨在Android中如何操作Bitmap,主要涵盖以下几个方面: 1. Bitmap对象创建 Android提供了多种创建Bitmap的方法。例如,从资源id创建(`BitmapFactory.decodeResource()`)、从文件路径创建(`...
在Android开发中,Bitmap是用于处理图像的基本类,它提供了对像素级别的操作。BitmapUtils工具类是为了方便开发者在处理图片时进行各种操作,比如转换、压缩、存储等。本篇文章将详细探讨`Android bitmap工具类`,...
在Android开发中,Bitmap对象是处理图像的主要方式,但它们可能会消耗大量内存,尤其是在处理大图或高分辨率图片时。为了优化性能并防止因内存不足引发的“OutOfMemoryError”,开发者通常需要对Bitmap进行压缩。...
3. **Bitmap解码**:Android提供了`BitmapFactory.decodeStream()`、`decodeFile()`、`decodeResource()`等方法解码图片。在解码24位深度Bitmap时,可以通过设置`BitmapFactory.Options`来优化,例如设置`...
Bitmap是Android中用于表示图像数据的类,它提供了丰富的操作方法,如缩放、裁剪、旋转等。在生成Bitmap后,我们可以使用`Bitmap.createScaledBitmap()`进行尺寸调整,`Bitmap.createBitmap()`用于创建一个新的...
在Android开发中,将View转换为Bitmap是一种常见的需求,尤其在实现屏幕截图、保存或分享View内容、创建自定义控件或动态生成图片等场景下。以下是对如何将Android View转换为Bitmap的深入解析,包括代码逻辑分析、...
在Android开发中,图片资源的处理是常见的需求之一,涉及到多种数据类型之间的转换,包括`Drawable`、`Bitmap`、`byte[]`等。本文将详细介绍这些类型之间的转换方法,以及如何实现灰度图像的转换。 ### 1. `...
在Android开发中,有时我们需要将View的显示内容截图并保存为Bitmap,以便进行分享或者其他图形处理操作。这个过程涉及到Android的视图系统、图形处理以及文件存储等多个知识点。以下将详细讲解如何实现这一功能。 ...
Bitmap是Android平台中用于处理图像的核心类,它包含了对图像数据的存储和操作。Bitmap对象存储实际的像素数据,可以通过Bitmap对象进行图像的显示、裁剪、旋转、缩放等操作。以下是一些关于Bitmap的重要知识点: 1...
`Bitmap`是Android系统中用于处理图像的核心类,它能够直接与像素数据进行交互,因此在处理网络图片时,`Bitmap`扮演着至关重要的角色。本示例源代码主要讲解如何在Android中进行网络图片的下载、处理以及相关的图片...
在安卓开发中,Bitmap是用于处理图像的基本类,它提供了位图操作的各种功能,包括加载、绘制、修改和保存图片。这份"安卓Android源码——(Bitmap位图渲染与操作)"的资料,很可能是深入讲解如何在Android系统中有效地...
9. **Bitmap操作**: - 放大/缩小Bitmap:`zoomBitmap`方法通过Matrix实现。 - Drawable转Bitmap:与上述第一点类似。 - 获取圆角Bitmap:`getRoundedCornerBitmap`方法利用Canvas和Paint创建圆角效果。 - 生成...
在Android应用开发中,Bitmap是用于处理图像的基本类,它代表了一个位图图像。位图渲染与操作是Android图形处理的重要部分,对于优化性能、创建动态效果和自定义UI至关重要。以下将详细讨论Bitmap的使用、渲染过程...
总结,异步下载图片返回Bitmap和路径是Android开发中的重要技术,涉及到多线程、网络请求、文件操作等多个方面。通过合理的设计和使用合适的工具,可以实现高效、稳定的图片加载功能,提升应用的用户体验。