java 中 mat 转 base64 两种方式

该博客介绍了如何在Java中将Mat类型的图像转换为Base64编码,包括通过先保存文件再编码和直接从Mat对象转换的两种方法。涉及的核心技术包括OpenCV的Mat对象处理、文件输入输出流、Base64编码和BufferedImage转换。
摘要由CSDN通过智能技术生成

Mat先转文件再转Base64

 
	private static String ImageToBase64(String imgPath) {
		byte[] data = null;
		// 读取图片字节数组
		try {
			InputStream in = new FileInputStream(imgPath);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 对字节数组Base64编码
		BASE64Encoder encoder = new BASE64Encoder();
		String base64Ret = encoder.encode(Objects.requireNonNull(data));
		// 返回Base64编码过的字节数组字符串
		System.out.println("本地图片转换Base64:" + ret);
		return base64Ret;
	}
private static String MatToBase64(Mat capImg){
 
    Imgcodecs.imwrite(tmpFilePath + "tmp.jpg", capImg);
	String base64 = ImageToBase64(tmpFilePath + "tmp.jpg");
}
 

Mat直接转Base64
 

private String MatToBase64(Mat capImg){
  
    String jpg_base64 = null;
    Imgcodecs.imwrite(tmpFilePath + "tmp.jpg", capImg);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(mat2BI(capImg), "jpg", baos);
    byte[] bytes = baos.toByteArray();
    BASE64Encoder encoder = new BASE64Encoder();
    jpg_base64 = encoder.encodeBuffer(Objects.requireNonNull(bytes));
    System.out.println("MAT转换Base64:" + jpg_base64);
    return jpg_base64;
}
 
	private BufferedImage mat2BI(Mat mat) {
		int dataSize = mat.cols() * mat.rows() * (int) mat.elemSize();
		byte[] data = new byte[dataSize];
		mat.get(0, 0, data);
		int type = mat.channels() == 1 ? BufferedImage.TYPE_BYTE_GRAY :         
        BufferedImage.TYPE_3BYTE_BGR;
 
		if (type == BufferedImage.TYPE_3BYTE_BGR) {
			for (int i = 0; i < dataSize; i += 3) {
				byte blue = data[i + 0];
				data[i + 0] = data[i + 2];
				data[i + 2] = blue;
			}
		}
		BufferedImage image = new BufferedImage(mat.cols(), mat.rows(), type);
		image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data);
 
		return image;
	}

以下是C++将cv::Mat换为base64编码的示例代码: ```c++ #include <opencv2/opencv.hpp> #include <iostream> #include <fstream> #include <sstream> #include <string> #include <cstring> #include <openssl/bio.h> #include <openssl/evp.h> #include <openssl/buffer.h> using namespace std; using namespace cv; string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { BIO *bio, *b64; BUF_MEM *bptr = BUF_MEM_new(); b64 = BIO_new(BIO_f_base64()); bio = BIO_new(BIO_s_mem()); bio = BIO_push(b64, bio); BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); BIO_write(bio, bytes_to_encode, in_len); BIO_flush(bio); BIO_get_mem_ptr(bio, &bptr); string encoded_string(bptr->data, bptr->length); BIO_free_all(bio); BUF_MEM_free(bptr); return encoded_string; } int main() { Mat image = imread("test.jpg"); if (image.empty()) { cerr << "Failed to load image" << endl; return -1; } vector<uchar> buffer; imencode(".jpg", image, buffer); string base64_image = base64_encode(buffer.data(), buffer.size()); cout << "Base64 encoded image: " << base64_image << endl; return 0; } ``` 在这个示例,我们首先加载图像,然后将其压缩为JPEG格式,并将压缩的字节换为base64编码的字符串。我们使用OpenSSL库的函数来执行实际的base64编码。 请注意,此示例使用C++11,并且需要OpenSSL库。在Ubuntu系统,您可以通过以下命令安装OpenSSL: ```bash sudo apt-get install libssl-dev ``` 此外,您需要在编译时链接OpenSSL库。在Ubuntu系统,您可以使用以下命令来编译代码: ```bash g++ -o main main.cpp -lopencv_core -lopencv_imgcodecs -lssl -lcrypto ``` 请注意,我们还需要链接OpenCV库(`opencv_core`和`opencv_imgcodecs`),这些库是用于图像处理的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superboy@.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值