如何将Qt发送的base64 字符串格式图片,在安卓TCP客户端正确显示,现代显示会闪退
时间: 2024-03-01 09:50:19 浏览: 136
如果在Android应用中接收到Qt发送的Base64字符串格式的图片,你可以使用以下代码将Base64字符串转换为位图,并将其显示在ImageView控件上:
```java
String base64Image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAA...";
String[] base64ImageParts = base64Image.split(","); // 分离出base64编码后的图片格式和编码字符串
String imageBase64 = base64ImageParts[1]; // 获取图片的Base64编码字符串
byte[] decodedString = Base64.decode(imageBase64, Base64.DEFAULT); // 将base64编码后的字符串解码成字节数组
Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); // 将字节数组转换为位图
ImageView imageView = findViewById(R.id.image_view); // 获取ImageView控件
imageView.setImageBitmap(bitmap); // 将位图显示在ImageView控件上
```
其中,`base64Image`是Base64编码后的图片字符串,可以从Qt发送的数据中获取;`imageBase64`是图片的Base64编码字符串;`decodedString`是Base64字符串解码后的字节数组;`bitmap`是最终转换得到的位图;`imageView`是用于显示位图的ImageView控件。
如果在现代Android设备上,你发现应用会闪退,可能是因为图片太大导致内存溢出。你可以尝试在将字节数组解码为位图时,使用`inSampleSize`参数来进行图片缩放,以减少内存占用。具体代码如下:
```java
String base64Image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAA...";
String[] base64ImageParts = base64Image.split(","); // 分离出base64编码后的图片格式和编码字符串
String imageBase64 = base64ImageParts[1]; // 获取图片的Base64编码字符串
byte[] decodedString = Base64.decode(imageBase64, Base64.DEFAULT); // 将base64编码后的字符串解码成字节数组
// 设置位图的解码参数
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length, options);
options.inSampleSize = calculateInSampleSize(options, 100, 100); // 设置缩放比例
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length, options); // 将字节数组转换为位图
ImageView imageView = findViewById(R.id.image_view); // 获取ImageView控件
imageView.setImageBitmap(bitmap); // 将位图显示在ImageView控件上
// 计算缩放比例
private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
```
在上面的代码中,`calculateInSampleSize`方法用于计算缩放比例,`reqWidth`和`reqHeight`分别表示所需的缩略图的宽度和高度,这里设置为100x100。你可以根据实际情况进行修改。
阅读全文