当前位置: 首页 > news >正文

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

// 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位BGR
                BYTE* p = srcRow + x * 3;
                b = p[0];
                g = p[1];
                r = p[2];
            }
            else if (srcBpp == 32) { // 32位BGRX
                BYTE* p = srcRow + x * 4;
                b = p[0];
                g = p[1];
                r = p[2];
            }
            else {
                return false;
            }

            // 转换为RGB565
            WORD 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位BGR
                BYTE* p = srcRow + x * 3;
                b = p[0];
                g = p[1];
                r = p[2];
            }
            else if (srcBpp == 32) { // 32位BGRX
                BYTE* p = srcRow + x * 4;
                b = p[0];
                g = p[1];
                r = p[2];
            }
            else {
                return false;
            }

            // 转换为RGB565
            WORD 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;
}

相关文章:

  • 直播预告|TinyEngine低代码引擎v2.2版本特性介绍
  • LabVIEW基于IMAQ实现直线边缘检测
  • µC/OS-III-事件标志
  • 探索 C 语言:编程世界的基石
  • 在kali linux中kafka的配置和使用
  • mysql深度分页优化方案
  • Redis 同步机制详解
  • 写Oracle表耗时25分钟缩短到23秒——SeaTunnel性能优化
  • 发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
  • CPaintDC的简单介绍
  • 大语言模型学习--本地部署DeepSeek
  • 利用机器学习进行信用风险评估
  • C语言总结目录
  • Moticon智能鞋垫传感器OpenGo:经济实用的运动科学研究与临床评估工具
  • Java 补充 - System.out.println 方法打印彩色文本(通过 ANSI 转义序列方式)
  • LLM大型语言模型(一)
  • 【期末考试应急处理】Linux 历年考试-试题及答案汇总
  • IDEA Tab 页设置多行显示
  • PXE批量网络装机与Kickstart自动化安装工具
  • RabbitMq高级
  • 安平县网站建设/重庆seo杨洋
  • 旅游主题网站模板/重庆森林为什么叫这个名字
  • 网站建设的局限性/网站seo在线诊断分析
  • 用织梦做的网站怎么管理系统/bing搜索 国内版
  • 下载微信公众号平台官网/广州市口碑seo推广
  • cssci期刊/长春seo公司哪家好