@@ -108,6 +108,9 @@ static std::vector<int> parse_optarg_int_array(const char *optarg) {
108108#include " realsr.h"
109109
110110#include " filesystem_utils.h"
111+ #include < opencv2/opencv.hpp>
112+ #include < opencv2/core/hal/interface.h>
113+ using namespace cv ;
111114
112115static void print_usage () {
113116 fprintf (stderr, " Usage: realsr-ncnn -i infile -o outfile [options]...\n\n " );
@@ -483,7 +486,29 @@ void *save(void *args) {
483486
484487 path_t ext = get_file_extension (v.outpath );
485488
486- if (ext == PATHSTR (" webp" ) || ext == PATHSTR (" WEBP" )) {
489+ if (ext != PATHSTR (" gif" )) {
490+ // 使用opencv保存图片,速度比默认的stb更快
491+ cv::Mat image;
492+ switch (v.outimage .elempack ) {
493+ case 1 :
494+ image = cv::Mat ( v.outimage .h , v.outimage .w , CV_8UC1, v.outimage .data ); // 单通道图像
495+ break ;
496+ case 3 :
497+ image = cv::Mat (v.outimage .h , v.outimage .w , CV_8UC3, v.outimage .data ); // 3通道图像
498+ cv::cvtColor (image, image, cv::COLOR_RGB2BGR);
499+ break ;
500+ case 4 :
501+ image = cv::Mat (v.outimage .h , v.outimage .w , CV_8UC4, v.outimage .data ); // 4通道图像
502+ cv::cvtColor (image, image, cv::COLOR_RGBA2BGRA);
503+ break ;
504+ }
505+ if (image.empty ()) {
506+ std::cerr << " Error: Image data not loaded." << std::endl;
507+ success = false ;
508+ } else {
509+ success = imwrite (v.outpath .c_str (), image);
510+ }
511+ }else if (ext == PATHSTR (" webp" ) || ext == PATHSTR (" WEBP" )) {
487512 success = webp_save (v.outpath .c_str (), v.outimage .w , v.outimage .h , v.outimage .elempack ,
488513 (const unsigned char *) v.outimage .data );
489514 } else if (ext == PATHSTR (" png" ) || ext == PATHSTR (" PNG" )) {
0 commit comments