0
点赞
收藏
分享

微信扫一扫

【Android】Android 封装 Bitmap 操作工具类


文章目录

  • ​​【Android】Android 封装 Bitmap 操作工具类​​
  • ​​BitmapUtils​​

【Android】Android 封装 Bitmap 操作工具类

BitmapUtils

  • Bitmap 转 Base64
  • Base64 转 Bitmap
  • 将网络资源图片转换为 Bitmap
  • 合并两个图片
  • 修改 Bitmap 图片大小
  • 两个位图覆盖合成为一个位图,以底层位图的长宽为基准
  • 把两个位图覆盖合成为一个位图,左右拼接
  • 把两个位图覆盖合成为一个位图,上下拼接
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.util.Base64;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
* 图片工具类
*
* @author Tellsea
* @date 2022/5/31
*/
public class BitmapUtils {

private static final String TAG = "BitmapUtils";

/**
* Bitmap 转 Base64
*
* @param bit
* @return
*/
public static String bitmapByBase64(Bitmap bit) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 参数100表示不压缩
bit.compress(Bitmap.CompressFormat.JPEG, 40, bos);
byte[] bytes = bos.toByteArray();
return Base64.encodeToString(bytes, Base64.DEFAULT);
}

/**
* base64 转 Bitmap
*
* @param base64Data
* @return
*/
public static Bitmap base64ToBitmap(String base64Data) {
String[] split = base64Data.split(",");
byte[] bytes;
if (split.length == 1) {
bytes = Base64.decode(base64Data, Base64.DEFAULT);
} else {
bytes = Base64.decode(split[1], Base64.DEFAULT);
}
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}

/**
* 将网络资源图片转换为Bitmap
*
* @param imgUrl 图片链接
* @return
*/
public static Bitmap netImageToBitmap(String imgUrl) {
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;
try {
in = new BufferedInputStream(new URL(imgUrl).openStream(), 1024);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, 1024);
byte[] b = new byte[1024];
int read;
while ((read = in.read(b)) != -1) {
out.write(b, 0, read);
}
out.flush();
byte[] data = dataStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
data = null;
return bitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

/**
* 合并两个图片
*
* @param imgUrl 图一链接
* @param imgUrl2 图二链接
* @param paper 纸张类型
* @return
*/
public static Bitmap mergePictureByUrl(String imgUrl, String imgUrl2, int paper) {
// 拼接图片:58为384像素,80为576像素
int width;
int height;
int paperWidth;
if (paper == 1) {
paperWidth = 384;
} else {
paperWidth = 576;
}
width = paperWidth / 2;
height = paperWidth / 2;
// 网图转为Bitmap,并修改大小
Bitmap bitmap = imageScale(netImageToBitmap(imgUrl), width, height);
Bitmap bitmap2 = imageScale(netImageToBitmap(imgUrl2), width, height);
return mergeBitmapLeftRight(bitmap, bitmap2, true);
}

/**
* 修改Bitmap图片大小
*
* @param bitmap
* @param new_w 新图片宽度
* @param new_h 新图片高度
* @return
*/
public static Bitmap imageScale(Bitmap bitmap, int new_w, int new_h) {
int src_w = bitmap.getWidth();
int src_h = bitmap.getHeight();
float scale_w = ((float) new_w) / src_w;
float scale_h = ((float) new_h) / src_h;
Matrix matrix = new Matrix();
matrix.postScale(scale_w, scale_h);
return Bitmap.createBitmap(bitmap, 0, 0, src_w, src_h, matrix, true);
}

/**
* 把两个位图覆盖合成为一个位图,以底层位图的长宽为基准
*
* @param backBitmap 在底部的位图
* @param frontBitmap 盖在上面的位图
* @return
*/
public static Bitmap mergeBitmapCenter(Bitmap backBitmap, Bitmap frontBitmap) {
if (backBitmap == null || backBitmap.isRecycled()
|| frontBitmap == null || frontBitmap.isRecycled()) {
Log.e(TAG, "backBitmap=" + backBitmap + ";frontBitmap=" + frontBitmap);
return null;
}
Bitmap bitmap = backBitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(bitmap);
Rect baseRect = new Rect(0, 0, backBitmap.getWidth(), backBitmap.getHeight());
Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());
canvas.drawBitmap(frontBitmap, frontRect, baseRect, null);
return bitmap;
}

/**
* 把两个位图覆盖合成为一个位图,左右拼接
*
* @param leftBitmap
* @param rightBitmap
* @param isBaseMax 是否以宽度大的位图为准,true则小图等比拉伸,false则大图等比压缩
* @return
*/
public static Bitmap mergeBitmapLeftRight(Bitmap leftBitmap, Bitmap rightBitmap, boolean isBaseMax) {

if (leftBitmap == null || leftBitmap.isRecycled()
|| rightBitmap == null || rightBitmap.isRecycled()) {
Log.e(TAG, "leftBitmap=" + leftBitmap + ";rightBitmap=" + rightBitmap);
return null;
}
int height = 0; // 拼接后的高度,按照参数取大或取小
if (isBaseMax) {
height = leftBitmap.getHeight() > rightBitmap.getHeight() ? leftBitmap.getHeight() : rightBitmap.getHeight();
} else {
height = leftBitmap.getHeight() < rightBitmap.getHeight() ? leftBitmap.getHeight() : rightBitmap.getHeight();
}

// 缩放之后的bitmap
Bitmap tempBitmapL = leftBitmap;
Bitmap tempBitmapR = rightBitmap;

if (leftBitmap.getHeight() != height) {
tempBitmapL = Bitmap.createScaledBitmap(leftBitmap, (int) (leftBitmap.getWidth() * 1f / leftBitmap.getHeight() * height), height, false);
} else if (rightBitmap.getHeight() != height) {
tempBitmapR = Bitmap.createScaledBitmap(rightBitmap, (int) (rightBitmap.getWidth() * 1f / rightBitmap.getHeight() * height), height, false);
}

// 拼接后的宽度
int width = tempBitmapL.getWidth() + tempBitmapR.getWidth();

// 定义输出的bitmap
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);

// 缩放后两个bitmap需要绘制的参数
Rect leftRect = new Rect(0, 0, tempBitmapL.getWidth(), tempBitmapL.getHeight());
Rect rightRect = new Rect(0, 0, tempBitmapR.getWidth(), tempBitmapR.getHeight());

// 右边图需要绘制的位置,往右边偏移左边图的宽度,高度是相同的
Rect rightRectT = new Rect(tempBitmapL.getWidth(), 0, width, height);

canvas.drawBitmap(tempBitmapL, leftRect, leftRect, null);
canvas.drawBitmap(tempBitmapR, rightRect, rightRectT, null);
return bitmap;
}


/**
* 把两个位图覆盖合成为一个位图,上下拼接
*
* @param topBitmap
* @param bottomBitmap
* @param isBaseMax 是否以高度大的位图为准,true则小图等比拉伸,false则大图等比压缩
* @return
*/
public static Bitmap mergeBitmapTopBottom(Bitmap topBitmap, Bitmap bottomBitmap, boolean isBaseMax) {

if (topBitmap == null || topBitmap.isRecycled()
|| bottomBitmap == null || bottomBitmap.isRecycled()) {
Log.e(TAG, "topBitmap=" + topBitmap + ";bottomBitmap=" + bottomBitmap);
return null;
}
int width = 0;
if (isBaseMax) {
width = topBitmap.getWidth() > bottomBitmap.getWidth() ? topBitmap.getWidth() : bottomBitmap.getWidth();
} else {
width = topBitmap.getWidth() < bottomBitmap.getWidth() ? topBitmap.getWidth() : bottomBitmap.getWidth();
}
Bitmap tempBitmapT = topBitmap;
Bitmap tempBitmapB = bottomBitmap;

if (topBitmap.getWidth() != width) {
tempBitmapT = Bitmap.createScaledBitmap(topBitmap, width, (int) (topBitmap.getHeight() * 1f / topBitmap.getWidth() * width), false);
} else if (bottomBitmap.getWidth() != width) {
tempBitmapB = Bitmap.createScaledBitmap(bottomBitmap, width, (int) (bottomBitmap.getHeight() * 1f / bottomBitmap.getWidth() * width), false);
}

int height = tempBitmapT.getHeight() + tempBitmapB.getHeight();

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);

Rect topRect = new Rect(0, 0, tempBitmapT.getWidth(), tempBitmapT.getHeight());
Rect bottomRect = new Rect(0, 0, tempBitmapB.getWidth(), tempBitmapB.getHeight());

Rect bottomRectT = new Rect(0, tempBitmapT.getHeight(), width, height);

canvas.drawBitmap(tempBitmapT, topRect, topRect, null);
canvas.drawBitmap(tempBitmapB, bottomRect, bottomRectT, null);
return bitmap;
}
}

举报

相关推荐

0 条评论