commit 84c25376609d0234647a52719c5e9d110c3f9e01 Author: dongl <2725096176@qq.com> Date: Mon Jan 15 21:01:00 2024 +0800 操作jepg diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e920ad4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.26) +project(Binarization) + +set(CMAKE_CXX_STANDARD 17) + +add_executable(Binarization main.cpp) diff --git a/WechatIMG7.jpg b/WechatIMG7.jpg new file mode 100644 index 0000000..a9bd329 Binary files /dev/null and b/WechatIMG7.jpg differ diff --git a/jpg_segments_out.txt b/jpg_segments_out.txt new file mode 100644 index 0000000..c4c6797 Binary files /dev/null and b/jpg_segments_out.txt differ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..2a9d38e --- /dev/null +++ b/main.cpp @@ -0,0 +1,123 @@ +#include +#include +#include + +int main() { + std::fstream jpg_in; + jpg_in.open("/Users/dongl/code/Binarization/WechatIMG7.jpg", std::ios::in); + if (!jpg_in.is_open()) { + perror("jpg 打开失败"); + } + + // 校验是否是jpg文件 + char file_header[2] = {0}; + // ARM 小端字节序 jpg标识头是0xffd8 所以小端0xd8ff + uint16_t jpg_header = 0xd8ff; + // 读取标识头 n-1 个字读 3-1=2 + jpg_in.get(file_header, 3); + if (memcmp(file_header, &jpg_header, 2) == 0) { + printf("FFD8 是jpg\n"); + } + + std::list application_segments; + std::list dqt_segments; + std::list frame_segments; + std::list huffman_segments; + std::list scan_segments; + std::string segments_buf = ""; + char key_marker = 0xFF; // 关键头 + char head_marker = 0xD8; // 文件头 + char app_marker = 0xE0; // app段 + char dqt_marker = 0xDB; // 定义量化头 + char frame_marker = 0xC0; // 帧段 + char huffman_marker = 0xC4; // huffman表 + char scan_marker = 0xDA; // 扫描段 + char foot_marker = 0xD9; // 文件尾 + //RSTn (Restart Marker):0xFFD0 至 0xFFD7,表示重启标记,用于在解码过程中进行数据恢复。 + //APPn (Application Segment n):0xFFE1 至 0xFFEF,表示其他应用段,可以用于存储各种应用程序或设备的相关信息。 + + char buf[1024] = {0}; + jpg_in.get(buf, sizeof(buf)); + char FFE0[2]; + uint16_t tmp1; + memcpy(&FFE0, &buf, 2); + memcpy(&tmp1, &FFE0, 2); + + while (jpg_in.get(buf, sizeof(buf))) { + // 读取取出来的文件缓存 + for (const auto &item: buf) { + // 查看是不是新的段 + if (item == key_marker && segments_buf != "") { + // 添加段 + // 添加应用段 + if (segments_buf[1] == app_marker) + application_segments.push_back(segments_buf); + // 定义量化表 + else if(segments_buf[1] == dqt_marker) + dqt_segments.push_back(segments_buf); + // 添加帧段 + if (segments_buf[1] == frame_marker) + frame_segments.push_back(segments_buf); + // huffman段 + if (segments_buf[1] == huffman_marker) + huffman_segments.push_back(segments_buf); + // 添加扫描段 + else if(segments_buf[1] == scan_marker) + scan_segments.push_back(segments_buf); + + // 文件尾 + else if(segments_buf[1] == foot_marker) { + segments_buf = ""; + break; + } + segments_buf = ""; + } + // 添加到段缓存 + segments_buf.push_back(item); + } + } + + std::fstream segments_out; + segments_out.open("/Users/dongl/code/Binarization/jpg_segments_out.txt", + std::ios::out | std::ios::ate); + if (!segments_out.is_open()) { + perror("jpg_segments_out 打开失败"); + } + + segments_out << "application_segments:\n"; + for (const auto &segments: application_segments) { + segments_out << segments; + segments_out << "\n"; + } + + segments_out << "dqt_segments:\n"; + for (const auto &segments: dqt_segments) { + segments_out << segments; + segments_out << "\n"; + } + + segments_out << "frame_segments:\n"; + for (const auto &segments: frame_segments) { + uint16_t tmp; + uint16_t frame_size; + memcpy(&tmp, segments.c_str()+2, 2); + memcpy(&frame_size, &tmp, 2); + segments_out << "frame_size: " << frame_size << "\n"; + } + + segments_out << "huffman_segments:\n"; + for (const auto &segments: huffman_segments) { + segments_out << segments; + segments_out << "\n"; + } + + segments_out << "scan_segments:\n"; + for (const auto &segments: scan_segments) { + segments_out << segments; + segments_out << "\n"; + } + + segments_out.close(); + jpg_in.close(); + return 0; +} diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..d17e4da --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wallhaven-3zxxdy.jpg b/wallhaven-3zxxdy.jpg new file mode 100644 index 0000000..ad9baa1 Binary files /dev/null and b/wallhaven-3zxxdy.jpg differ