C++ 将jpg图片变成16位565bmp图片

news/2025/3/6 21:30:19/
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include<string>
#include <atlimage.h>bool ConvertJpgTo16BitBmp565(const char* input_path, const char* output_path) {CImage srcImage, dstImage;// 1. 加载源图像srcImage.Load(input_path);int width = srcImage.GetWidth();int height = srcImage.GetHeight();int srcBpp = srcImage.GetBPP();int srcPitch = srcImage.GetPitch();BYTE* srcBits = static_cast<BYTE*>(srcImage.GetBits());// 2. 创建目标图像(负高度表示自上而下存储)DWORD masks[] = { 0xF800, 0x07E0, 0x001F };dstImage.CreateEx(width, height, 16, BI_BITFIELDS, masks);// 3. 获取目标图像参数(实际步长由API返回)int dstPitch = dstImage.GetPitch();BYTE* dstBits = static_cast<BYTE*>(dstImage.GetBits());// 5. 处理像素数据(无需反转行顺序)for (int y = 0; y < height; ++y) {BYTE* srcRow = srcBits + y * srcPitch;BYTE* dstRow = dstBits + y * dstPitch;for (int x = 0; x < width; ++x) {BYTE r, g, b;// 解析源像素颜色if (srcBpp == 24) { // 24位BGRBYTE* p = srcRow + x * 3;b = p[0];g = p[1];r = p[2];}else if (srcBpp == 32) { // 32位BGRXBYTE* p = srcRow + x * 4;b = p[0];g = p[1];r = p[2];}else {return false;}// 转换为RGB565WORD rgb565 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);// 安全写入目标像素dstRow[x * 2] = static_cast<BYTE>(rgb565 & 0xFF);       // 低位字节dstRow[x * 2 + 1] = static_cast<BYTE>((rgb565 >> 8)); // 高位字节}}dstImage.Save(output_path, Gdiplus::ImageFormatBMP);return true;
}
int main()
{if (__argc < 2)return 0;for (int i = 1; i < __argc; i++){std::string h = __argv[i];if (strcmp(h.substr(h.length() - 3).c_str(), "jpg"))continue;h=h.substr(0, h.length() - 3);h += "bmp";printf(h.c_str());ConvertJpgTo16BitBmp565(__argv[i], h.c_str());}return 0;
}

特殊情况使用这个,这个的效果是将图片的前8位和后8位进行对调

#include <iostream>
#include<string>
#include <atlimage.h>bool ConvertJpgTo16BitBmp565(const char* input_path, const char* output_path) {CImage srcImage, dstImage;// 1. 加载源图像srcImage.Load(input_path);int width = srcImage.GetWidth();int height = srcImage.GetHeight();int srcBpp = srcImage.GetBPP();int srcPitch = srcImage.GetPitch();BYTE* srcBits = static_cast<BYTE*>(srcImage.GetBits());// 2. 创建目标图像(负高度表示自上而下存储)DWORD masks[] = { 0xF800, 0x07E0, 0x001F };dstImage.CreateEx(width, height, 16, BI_BITFIELDS, masks);// 3. 获取目标图像参数(实际步长由API返回)int dstPitch = dstImage.GetPitch();BYTE* dstBits = static_cast<BYTE*>(dstImage.GetBits());// 5. 处理像素数据(无需反转行顺序)for (int y = 0; y < height; ++y) {BYTE* srcRow = srcBits + y * srcPitch;BYTE* dstRow = dstBits + y * dstPitch;for (int x = 0; x < width; ++x) {BYTE r, g, b;// 解析源像素颜色if (srcBpp == 24) { // 24位BGRBYTE* p = srcRow + x * 3;b = p[0];g = p[1];r = p[2];}else if (srcBpp == 32) { // 32位BGRXBYTE* p = srcRow + x * 4;b = p[0];g = p[1];r = p[2];}else {return false;}// 转换为RGB565WORD rgb565 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);// 安全写入目标像素dstRow[x * 2] = static_cast<BYTE>((rgb565 >> 8));      // 低位字节dstRow[x * 2 + 1] = static_cast<BYTE>(rgb565 & 0xFF); // 高位字节}}dstImage.Save(output_path, Gdiplus::ImageFormatBMP);return true;
}
int main()
{if (__argc < 2)return 0;for (int i = 1; i < __argc; i++){std::string h = __argv[i];if (strcmp(h.substr(h.length() - 3).c_str(), "jpg"))continue;h=h.substr(0, h.length() - 3);h += "bmp";printf(h.c_str());ConvertJpgTo16BitBmp565(__argv[i], h.c_str());}return 0;
}

http://www.ppmy.cn/news/1577180.html

相关文章

deepseek在pycharm 中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm&#xff0c;如何接入deepseek是我们窥探ai代码编写的第一步&#xff0c;熟悉起来总没坏处。 1、官网安装pycharm社区版&#xff08;免费&#xff09;&#xff0c;如果需要安装专业版&#xff0c;需要另外找破解码。 2、安装Ollama…

(功能测试)第五章 APP性能测试 常用的APP命令格式 补充与总结

app性能测试 solopi 工具监控性能数据 实时监控所选项的各类数据的变化 性能测试就是记录性能数据 从而去分析是否是存在有异常 使用工具去监控数据 查看录制数据 可以持续使用两个小时去查看性能的使用情况 重点是对拿到的数据去进行分析 内存数据查看 性能指标有如下内容&a…

学习工具的一天之(burp)

第一呢一定是先下载 【Java环境】&#xff1a;Java Downloads | Oracle 下来是burp的下载 Download Burp Suite Community Edition - PortSwigger 【下载方法二】关注的一个博主 【BurpSuite 安装激活使用详细上手教程 web安全测试工具】https://www.bilibili.com/video/BV…

物业管理系统源码 物业小程序源码

物业管理系统源码 物业小程序源码 一、基础信息管理 1. 房产信息管理 记录楼栋、单元、房间的详细信息&#xff08;面积、户型、产权等&#xff09;。 管理业主/租户的档案&#xff0c;包括联系方式、合同信息等。 2. 公共资源管理 管理停车场、电梯、绿化带、公…

DeepSeek开源大模型的市场策略:真实目的解析

根据第四期财经 DeepSeek单纯硬件成本就近百亿&#xff0c;那为什么要免费开源呢&#xff1f; 此博客深入分析大模型开源的市场策略&#xff0c;特别是DeepSeek的开源策略背后的真实目的。大模型的“开源”不同于传统软件开源&#xff0c;实际上是一种商业策略——免费给你挖半…

【五.LangChain技术与应用】【9.LangChain ChatPromptTemplate(上):高级对话模板设计】

LangChain ChatPromptTemplate完全攻略(上):让AI对话拥有导演思维 (全文约6000字,实战代码占比40%,建议搭配Jupyter Notebook阅读) 凌晨三点的办公室,你盯着刚写完的客服对话系统,AI回复总是把"我要投诉!“处理成"我要投喂~”。同事小李凑过来瞥了一眼代…

将PDF转为Word的在线工具

参考视频&#xff1a;外文翻译 文章目录 一、迅捷PDF转换器二、Smallpdf 一、迅捷PDF转换器 二、Smallpdf

MFC 的固定签名

书籍&#xff1a;《Visual C 2017从入门到精通》的2.1.3 手工写一个稍复杂的MFC程序 环境&#xff1a;visual studio 2022 内容&#xff1a;MFC 的固定签名 说明&#xff1a;大部分知识点来自腾讯元宝 1.是什么&#xff1f; ​在 MFC&#xff08;Microsoft Foundation Clas…