【工具】raw与jpg互转python-cpp

在工作中常常需要将图像转化为raw数据或者yuv数据,这里将提供 cpp 版本和 python 版本的互转代码

代码链接见文档尾部。

cpp 版本

jpg2raw.cpp

#include <fstream>
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>// Windows 和 Linux 下通用的创建目录函数
#ifdef _WIN32
#include <direct.h> // For _mkdir on Windows
#define MKDIR(dir) _mkdir(dir)
#else
#include <sys/stat.h> // For mkdir on POSIX systems
#define MKDIR(dir) mkdir(dir, 0755)
#endifbool create_directory(const std::string &dir_path)
{
#ifdef _WIN32if (_mkdir(dir_path.c_str()) != 0){return false;}
#elseif (MKDIR(dir_path.c_str()) != 0 && errno != EEXIST){return false;}
#endifreturn true;
}int main(int argc, char **argv)
{if (argc != 2){std::cerr << "Usage: ./image_to_raw input_image.jpg" << std::endl;return -1;}std::string input_image_path = argv[1];std::string base_name = input_image_path.substr(input_image_path.find_last_of('/') + 1); // Unix风格路径分隔符
#ifdef _WIN32std::replace(base_name.begin(), base_name.end(), '\\', '/'); // 对于Windows下的反斜杠,统一转换为正斜杠
#endifstd::cout <<" ----------- input_image_path: " << input_image_path << " ------------------------"<<std::endl;std::cout <<" ----------- basename: " << base_name << " ------------------------"<<std::endl;std::string raw_dir = "raws/";// std::string output_raw_path = raw_dir + base_name + ".raw";std::string file_name = input_image_path.substr(input_image_path.find_last_of("/\\") + 1);std::string file_name_without_suffix = file_name.substr(0, file_name.find_last_of("."));std::string file_name_with_suffix = file_name_without_suffix + ".raw";std::string output_raw_path = raw_dir + file_name_with_suffix;// 创建 'raw' 子目录(如果不存在)if (!create_directory(raw_dir)){std::cerr << "Failed to create directory: " << raw_dir << std::endl;//return -1;}cv::Mat img = cv::imread(input_image_path, 1);if (img.empty()){std::cerr << "Failed to load the image: " << input_image_path << std::endl;return -1;}int im_width = img.cols;int im_height = img.rows;int im_depth = img.channels();std::cout << "im_width: " << im_width << std::endl;std::cout << "im_height: " << im_height << std::endl;std::cout << "im_depth: " << im_depth << std::endl;// 写入 RAW 文件std::ofstream raw_file(output_raw_path, std::ios::binary);if (!raw_file.is_open()){std::cerr << "Failed to open file for writing: " << output_raw_path << std::endl;return -1;}raw_file.write(reinterpret_cast<const char *>(img.data), im_width * im_height * im_depth);raw_file.close();std::cout << "Converted " << input_image_path << " to " << output_raw_path << std::endl;return 0;
}

raw2jpg

#include <fstream>
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <unordered_map>#ifdef _WIN32
#include <direct.h> // For _mkdir on Windows
#define MKDIR(dir) _mkdir(dir)
#else
#include <sys/stat.h> // For mkdir on POSIX systems
#define MKDIR(dir) mkdir(dir, 0755)
#endifstruct ImageSize
{int width;int height;
};const std::unordered_map<int, ImageSize> image_sizes = {{921600, {640, 480}},{2764800, {1280, 720}},{5858640, {1896, 1030}},{6220800, {1920, 1080}},{11059200, {2560, 1440}},{12257280, {2688, 1520}},{15116544, {2592, 1944}},{3686400, {1280, 960}}};// 跨平台创建目录函数(仅支持Linux和Windows)
bool create_directory(const std::string &path)
{
#ifdef _WIN32return (_mkdir(path.c_str()) == 0);
#elsereturn (::mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == 0);
#endif
}int main(int argc, char **argv)
{if (argc != 2){std::cerr << "Usage: ./raw_image_viewer raw_image.raw" << std::endl;return -1;}std::string raw_image_path = argv[1];std::cout << "raw_image_path: " << raw_image_path << std::endl;// 获取文件大小std::ifstream file(raw_image_path, std::ios::binary | std::ios::ate);size_t file_size = file.tellg();file.close();std::cout << "size: " << file_size << " bytes" << std::endl;// 查找对应的图像尺寸auto it = image_sizes.find(file_size);if (it == image_sizes.end()){std::cout << file_size << " is not supported!" << std::endl;return -1;}const ImageSize &size = it->second;int im_width = size.width;int im_height = size.height;int im_depth = 3; // 假设所有图像都是RGB三通道std::cout << "im_width: " << im_width << std::endl;std::cout << "im_height: " << im_height << std::endl;std::cout << "im_depth: " << im_depth << std::endl;cv::Mat raw_image(im_height, im_width, CV_8UC3);// 读取 RAW 文件的内容std::ifstream raw_file(raw_image_path, std::ios::binary);raw_file.read(reinterpret_cast<char *>(raw_image.data), im_width * im_height * im_depth);raw_file.close();// 提取并创建 images 文件夹(跨平台)std::string images_path = "images/";bool dir_created = create_directory(images_path);std::string file_name = raw_image_path.substr(raw_image_path.find_last_of("/\\") + 1);std::string file_name_without_suffix = file_name.substr(0, file_name.find_last_of("."));std::string file_name_with_suffix = file_name_without_suffix + ".jpg";std::string output_path = images_path + file_name_with_suffix;cv::imwrite(output_path, raw_image);std::cout << " images_path: " << images_path << std::endl;std::cout << " file_name_with_suffix: " << file_name_with_suffix << std::endl;std::cout << " file save name: " << output_path << std::endl;if (!dir_created){std::cerr << "Failed to create 'images' directory." << std::endl;}// (可选)显示图像// cv::imshow("raw_image", raw_image);// cv::waitKey(5);// cv::destroyAllWindows();// (可选)删除原始 RAW 文件// std::remove(raw_image_path.c_str());return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)project(convertRAW2jpg CXX)# 设置安装目录
set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/install")
set(CMAKE_SKIP_INSTALL_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")# 要求编译器支持C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)# Windows 特定选项和标志
if(MSVC)add_compile_options(/utf-8)add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()# OpenCV 手动配置部分(保留 find_package 并注释)
if(WIN32)# find_package(OpenCV REQUIRED)  # 注释掉以使用自定义路径set(OpenCV_DIR "D:/opencv480vc16/build" CACHE PATH "Path to a custom OpenCV build on Windows")set(OPENCV_INCLUDE_DIRS "${OpenCV_DIR}/include")set(OPENCV_LIB_DIR     "${OpenCV_DIR}/x64/vc16/lib") # 根据实际编译器版本调整include_directories(${OPENCV_INCLUDE_DIRS})link_directories(${OPENCV_LIB_DIR})list(APPEND EXTRA_LIBS opencv_world480.lib) # 根据实际OpenCV库名称调整
elseif(NOT WIN32)# Linux 下的手动 OpenCV 配置# find_package(OpenCV REQUIRED)  # 注释掉以使用自定义路径set(OpenCV_DIR "~/install/opencv4.5.4" CACHE PATH "Path to a custom OpenCV build on Unix-like systems")set(OPENCV_INCLUDE_DIRS "${OpenCV_DIR}/include/opencv4")set(OPENCV_LIB_DIR     "${OpenCV_DIR}/lib")include_directories(${OPENCV_INCLUDE_DIRS})link_directories(${OPENCV_LIB_DIR})list(APPEND EXTRA_LIBS opencv_world -fopenmp -lpthread -lm) # 根据实际OpenCV库名称和依赖调整
endif()include_directories(${OpenCV_INCLUDE_DIRS})# 添加源文件
add_executable(raw2jpg src/raw2jpg.cpp)
add_executable(jpg2raw src/jpg2raw.cpp)target_link_libraries(raw2jpg PRIVATE ${EXTRA_LIBS})
target_link_libraries(jpg2raw PRIVATE ${EXTRA_LIBS})# 安装目标及辅助脚本
set(TMP_TEST_DIR ${PROJECT_SOURCE_DIR}/temp_example)
install(TARGETS raw2jpgRUNTIME DESTINATION examplesRUNTIME DESTINATION ${TMP_TEST_DIR})install(TARGETS jpg2rawRUNTIME DESTINATION examplesRUNTIME DESTINATION ${TMP_TEST_DIR})# 找到 assets 目录下所有的 raw 文件,并安装到临时目录
FILE(GLOB RAWS assets/raws/*.raw)
FILE(GLOB JPGS assets/jpgs/*.jpg)install(FILES ${RAWS} DESTINATION ${TMP_TEST_DIR}/test_raws)
install(FILES ${JPGS} DESTINATION ${TMP_TEST_DIR}/test_jpgs)if (WIN32)install(FILES ${PROJECT_SOURCE_DIR}/onekey_windows_batch2jpg.batDESTINATION examplesDESTINATION ${TMP_TEST_DIR})install(FILES ${PROJECT_SOURCE_DIR}/onekey_windows_batch2raw.batDESTINATION examplesDESTINATION ${TMP_TEST_DIR})
else()install(FILES ${PROJECT_SOURCE_DIR}/onekey_ubuntu_batch2jpg.shDESTINATION examplesDESTINATION ${TMP_TEST_DIR})install(FILES ${PROJECT_SOURCE_DIR}/onekey_ubuntu_batch2raw.shDESTINATION examplesDESTINATION ${TMP_TEST_DIR})
endif(WIN32)

批量将 raw 转换为 jpg 的脚本

ubuntu

onekey_ubuntu_batch2jpg.sh

#!/bin/bash
set -eif [ $# -eq 0 ]; thenim_path=`pwd`
elseim_path=$1
fiecho "batch convert the raw image to jpg images in path: $im_path"
i=0
for im in $(ls $im_path)
do if [ "${im##*.}" = "raw" ]; thenif [ -f $im_path/$im ];thenecho "convert $file to jpg image..."./raw2jpg $im_path/$imlet i+=1fifi
done 
echo "DONE: $i pictures been gennerated!"**s**
windows

onekey_windows_batch2jpg.bat

@echo off@REM 如果没有输入路径, 就使用当前路径
@if "%~1"=="" (set "im_path=%cd%"
) else (set "im_path=%~1"
)@REM 输出批处理将要转换文件的路径信息
echo Batch converting RAW images to JPG in the current directory or specified path: %im_path%@REM 遍历指定目录及其子目录下的所有.raw文件
for /R "%im_path%" %%i in (*.raw) do (@REM 获取图片名称(不包括完整路径)set "img_file=%%~ni"@REM 输出正在处理的原始图像文件名echo Processing image: %%i@REM 调用 raw2jpg.exe 进行转换,由于程序内部已经设置了输出目录和文件名规则,所以这里仅传入原始文件路径即可.\raw2jpg.exe "%%i"
)@REM 暂停脚本执行,等待用户按键继续
pause

批量将 jpg 转换为 raw 的脚本

ubuntu

onekey_ubuntu_batch2raw.sh

#!/bin/bash
set -eif [ $# -eq 0 ]; thenim_path=`pwd`
elseim_path=$1
fiecho "batch convert the jpg images to raw image in path: $im_path"
i=0
for im in $(ls $im_path)
do if [ "${im##*.}" = "jpg" ]; thenif [ -f $im_path/$im ];thenecho "convert $file to jpg image..."./jpg2raw $im_path/$imlet i+=1fifi
done 
echo "DONE: $i pictures been gennerated!"s
windows

onekey_windows_batch2raw.bat

@echo off@REM 如果没有输入路径, 就使用当前路径
if "%1"=="" (set "im_path=%cd%"
) else (set "im_path=%~1"
)@REM 输出当前处理的路径
echo Batch converting image files to raw images in path: %im_path%@REM 遍历指定目录及其子目录下的所有.jpg, .jpeg, .bmp, .png文件
for /R "%im_path%" %%i in (*.jpg, *.jpeg, *.bmp, *.png) do (@REM 获取图片名称(这里保留完整路径)echo Processing image: %%i.\jpg2raw.exe "%%i"
)pause

所有代码见

raw2jpg-github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle版本号中的i,G,C代表什么含义

大家都熟悉的 Oracle 版本号有 9i、10G、11G、12C、19C 等&#xff0c;但在早期&#xff0c;Oracle 的版本号并不包含这些字母。 最初&#xff0c;Oracle 的版本号简单地是 1、2、3、4 等&#xff0c;一直发展到 1999 年发布的 8i 版本。20 世纪末是互联网爆发式发展的时代。 …

将一个excel文件里面具有相同参数的行提取后存入新的excel

功能描述&#xff1a; 一个excel里面有很多行数据&#xff0c;其中“交易时间”这一列有很多交易日期&#xff0c;有些行的交易日期是一样的&#xff0c;那么就把所有交易日期相同的行挑出来&#xff0c;形成一个新的以交易日期命名的文件。import pandas as pd import os# 读取…

跨境ERP定制趋势预测:数字化转型助您赢得市场先机

随着全球贸易的不断融合和发展&#xff0c;跨境业务已成为许多企业拓展市场的重要途径。在这个背景下&#xff0c;ERP定制正逐渐成为企业数字化转型的关键利器。本文将为您预测跨境ERP定制的趋势&#xff0c;并探讨数字化转型如何助您赢得市场先机。 ERP定制趋势预测 1. 数据…

命令行启动Android Studio模拟器

1、sdk路径查看&#xff08;打开Android Studio&#xff09; 以上前提是安装的Android Studio并添加了模拟器&#xff01;&#xff01;&#xff01; 2、复制路径在终端进入到 cd /Users/duxi/Library/Android/sdk目录&#xff08;命令行启动不用打开Android Studio就能运行模拟…

【Java程序设计】【C00182】基于SSM的高校成绩报送管理系统(论文+PPT)

基于SSM的高校成绩报送管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的高校成绩报送系统 本系统分为前台系统、管理员、教师以及学生4个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首…

25考研北大软微该怎么做?

25考研想准备北大软微&#xff0c;那肯定要认真准备了 考软微需要多少实力 现在的软微已经不是以前的软微了&#xff0c;基本上所有考计算机的同学都知道&#xff0c;已经没有什么信息优势了&#xff0c;只有实打实的有实力的选手才建议报考。 因为软微的专业课也是11408&am…

PyTorch自动微分机制的详细介绍

PyTorch深度学习框架的官方文档确实提供了丰富的信息来阐述其内部自动微分机制。在PyTorch中&#xff0c;张量&#xff08;Tensor&#xff09;和计算图&#xff08;Computation Graph&#xff09;的设计与实现使得整个系统能够支持动态的、高效的自动求导过程。 具体来说&#…

掌握Java多线程利器:ConcurrentHashMap详解

在并发编程的世界里&#xff0c;每一个微小的延迟都可能积累成为性能瓶颈。今天&#xff0c;让我们一起揭开Java中ConcurrentHashMap的神秘面纱&#xff0c;这是一个在多线程环境中不可或缺的高性能组件。从它的设计理念到底层实现&#xff0c;我们将详细探讨ConcurrentHashMap…

基于团簇阵列中的量子隧穿效应的氢气传感器

在科技日新月异的今天&#xff0c;传感器技术也在不断地发展和创新。其中&#xff0c;基于团簇阵列中的量子隧穿效应的氢气传感器&#xff0c;以其独特的优势和巨大的潜力&#xff0c;成为了气体检测技术领域的一颗新星。 一、什么是基于团簇阵列中的量子隧穿效应的氢气传感器&…

浅谈Java主流锁

浅谈Java主流锁 synchronized关键字 synchronized是Java中最基本的锁机制&#xff0c;可以用来修饰方法或代码块。 修饰方法&#xff1a; public synchronized void method() {// 代码 }修饰代码块&#xff1a; public void method() {synchronized (this) {// 代码} }synch…

年度重磅更新!“AI+可视化拖拽”实现个性化页面极速开发!组件设计器即将上线!

AI智能开发&#xff01;网站一键复刻&#xff01;设计稿秒变成品&#xff01; 相信对很多关注低代码和AI技术的小伙伴来说&#xff0c; 都觉得像这些还只是停留在概念上的技术&#xff0c;很难落地实践。 但是在「织信」已经全部都做到了&#xff01; 无图无真相&#xff0…

企业车辆管理乱、用车难?来试试车辆管理系统!

车辆作为最重要的交通工具在企业中得以普及。随着车辆保有量的不断攀升&#xff0c;企业对于车辆管理的要求也越来越高&#xff0c;会要求管理的多维度和车辆使用的灵活性。 传统的表格管理方式很难及时跟进企业车辆的使用状态&#xff0c;导致企业车辆管理效率低、车辆使用调…

喜讯!聚铭网络上榜《CCSIP 2023 中国网络安全行业全景册(第六版)》18项安全细分领域

近日&#xff0c;国内网络安全行业权威媒体FreeBuf咨询正式发布 《CCSIP 2023 中国网络安全行业全景册&#xff08;第六版&#xff09;》&#xff08;以下简称“全景册”&#xff09;&#xff0c;旨在为企业安全建设及产品选型提供参考。 聚铭网络凭借先进的技术创新能力、丰富…

关于Python运用pyecharts实现简单的数据分析-——柱状图、饼状图

1.什么是pyecharts? Pyecharts是一个将Echarts与Python结合的数据可视化库。而Echarts本身是由百度开源的一个基于JavaScript的数据可视化库,它以良好的交互性和精巧的图表设计而受到开发者的认可。Python是一门非常适合数据处理的编程语言,具有强大的表达力和丰富的数据处…

C++入门(一)— 使用VScode开发简介

文章目录 C 介绍C 擅长领域C 程序是如何开发编译器、链接器和库编译预处理编译阶段汇编阶段链接阶段 安装集成开发环境 &#xff08;IDE&#xff09;配置编译器&#xff1a;构建配置配置编译器&#xff1a;编译器扩展配置编译器&#xff1a;警告和错误级别配置编译器&#xff1…

「连载」边缘计算(九)01-26:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; Cloudcore源码入口 Cloudcore源码入口为KubeEdge/cloud/CloudCore/CloudCore.go。 CloudCore 源码入口函数具体如下所示。 func main() { command : app.NewCloudCoreCommand() //此函数是对cobra调用的封装 ... } 进入app.NewCloudCoreCo…

Databend 开源周报第 130 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持 CREATE OR…

【笔记】Helm-5 Chart模板指南-4 模板函数和流水线

模板函数和流水线 到目前为止&#xff0c;我们已经知道了如何将信息传到模板中。但是传入的信息并不能被修改。有时我们希望以一种更有用的方式来转换所提供的数据。 让我们从一个最佳实践开始&#xff1a;可以通过调用模板指令中的quote函数把 .Values对象中的字符串属性用引…

手机壳也能散热了?

作为一个玩了6年的王者荣耀玩家&#xff0c;手机发热真的很影响游戏体验&#xff01;&#xff01;游戏掉帧&#xff0c;性能下降很恼人&#xff0c;试过好几个散热工具&#xff0c;实际效果都不太好&#xff5e; 自从入了Mate 60之后&#xff0c;看着这款微泵液冷壳毫无犹豫第…

计数排序(六)——计数排序及排序总结

目录 一.前言 二.归并小补充 三.计数排序 操作步骤&#xff1a; 代码部分&#xff1a; 四.稳定性的概念&#xff1a; 五.排序大总结&#xff1a; ​六.结语 一.前言 我们已经进入排序的尾篇了&#xff0c;本篇主要讲述计数排序以及汇总各类排序的特点。码字不易&#x…