Redis存储图像并读取记录
一、任务描述
使用Redis存储图像,并使用Redis将图像进行读取保存为新的名字。
主要流程为:
1.利用Opencv读取图像,并将图像数据转换为字节流;
2.将字节流存储到Redis中
3.从Redis中读取图像
4.将字节流转换回图像
5.将图像保存为另一个名称的图像
二、C++代码
1.主体代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <hiredis/hiredis.h>
int main() {
// 读取图像
cv::Mat img = cv::imread("1.jpg");
// 将图像转换为字节流
std::vector<uchar> img_bytes;
cv::imencode(".jpg", img, img_bytes);
// 将字节流存储到Redis中
redisContext* redis = redisConnect("127.0.0.1", 6379);
redisReply* reply = (redisReply*)redisCommand(redis, "SET image %b", img_bytes.data(), img_bytes.size());
freeReplyObject(reply);
// 从Redis中读取图像
reply = (redisReply*)redisCommand(redis, "GET image");
std::vector<uchar> img_redis(reply->str, reply->str + reply->len);
freeReplyObject(reply);
// 将字节流转换回图像
cv::Mat img_decoded = cv::imdecode(img_redis, cv::IMREAD_COLOR);
// 将图像保存为另一个名称的图像
cv::imwrite("out.jpg", img_decoded);
// 断开Redis连接
redisFree(redis);
return 0;
}
2.配置文件Pro内容
在QT中编写的代码,需要配置Pro文件。
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
main.cpp
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv4/opencv2 \
/usr/local/include/opencv4
LIBS += /usr/local/lib/libopencv_*.so \
-lhiredis
三、Python代码示例
import redis
import cv2
import numpy as np
# 读取图像
img = cv2.imread('1.jpg')
# 将图像转换为字节流
img_bytes = cv2.imencode('.jpg', img)[1].tobytes()
# 将字节流存储到Redis中
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
r.set('image', img_bytes)
# 从Redis中读取图像
img_redis = r.get('image')
# 将字节流转换回图像
img_np = np.frombuffer(img_redis, np.uint8)
img_redis = cv2.imdecode(img_np, cv2.IMREAD_COLOR)
# 将图像保存为另一个名称的图像
cv2.imwrite('out.jpg', img_redis)