最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)圖片jpg格式變成16位565bmp格式

 更新時間:2025年03月06日 09:31:46   作者:萬能的小裴同學  
這篇文章主要為大家詳細介紹了C++如何實現(xiàn)圖片jpg格式變成16位565bmp格式,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

C++ 將jpg圖片變成16位565bmp圖片

// ConsoleApplication1.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結束。
//

#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. 創(chuàng)建目標圖像(負高度表示自上而下存儲)
    DWORD masks[] = { 0xF800, 0x07E0, 0x001F };
    dstImage.CreateEx(width, height, 16, BI_BITFIELDS, masks);

    // 3. 獲取目標圖像參數(shù)(實際步長由API返回)
    int dstPitch = dstImage.GetPitch();
    BYTE* dstBits = static_cast<BYTE*>(dstImage.GetBits());
    // 5. 處理像素數(shù)據(jù)(無需反轉(zhuǎn)行順序)
    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;
            }

            // 轉(zhuǎn)換為RGB565
            WORD rgb565 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
            // 安全寫入目標像素
            dstRow[x * 2] = static_cast<BYTE>(rgb565 & 0xFF);       // 低位字節(jié)
            dstRow[x * 2 + 1] = static_cast<BYTE>((rgb565 >> 8)); // 高位字節(jié)
        }
    }
    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位進行對調(diào)

#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. 創(chuàng)建目標圖像(負高度表示自上而下存儲)
    DWORD masks[] = { 0xF800, 0x07E0, 0x001F };
    dstImage.CreateEx(width, height, 16, BI_BITFIELDS, masks);

    // 3. 獲取目標圖像參數(shù)(實際步長由API返回)
    int dstPitch = dstImage.GetPitch();
    BYTE* dstBits = static_cast<BYTE*>(dstImage.GetBits());
    // 5. 處理像素數(shù)據(jù)(無需反轉(zhuǎn)行順序)
    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;
            }

            // 轉(zhuǎn)換為RGB565
            WORD rgb565 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
            // 安全寫入目標像素
            dstRow[x * 2] = static_cast<BYTE>((rgb565 >> 8));      // 低位字節(jié)
            dstRow[x * 2 + 1] = static_cast<BYTE>(rgb565 & 0xFF); // 高位字節(jié)
        }
    }
    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;
}

方法補充

下面小編為大家整理了C++實現(xiàn)圖片轉(zhuǎn)換不同格式的方法,需要的可以了解下

#include <opencv2/opencv.hpp>
#include <iostream>
 
int main() {
    // 輸入文件路徑和輸出文件路徑
    std::string inputImagePath, outputImagePath;
    
    std::cout << "Enter the input image file path: ";
    std::cin >> inputImagePath;
    
    std::cout << "Enter the output image file path (e.g., output.png, output.jpg): ";
    std::cin >> outputImagePath;
 
    // 讀取圖片
    cv::Mat image = cv::imread(inputImagePath, cv::IMREAD_UNCHANGED);
 
    // 檢查圖片是否成功加載
    if (image.empty()) {
        std::cerr << "Error: Could not open or find the image!" << std::endl;
        return -1;
    }
 
    // 保存圖片到新格式
    bool success = cv::imwrite(outputImagePath, image);
 
    if (success) {
        std::cout << "Image successfully converted and saved to " << outputImagePath << std::endl;
    } else {
        std::cerr << "Error: Could not save the image!" << std::endl;
    }
 
    return 0;
}

到此這篇關于C++實現(xiàn)圖片jpg格式變成16位565bmp格式的文章就介紹到這了,更多相關C++圖片jpg轉(zhuǎn)bmp內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 老生常談C++的單例模式與線程安全單例模式(懶漢/餓漢)

    老生常談C++的單例模式與線程安全單例模式(懶漢/餓漢)

    下面小編就為大家?guī)硪黄仙U凜++的單例模式與線程安全單例模式(懶漢/餓漢)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++程序內(nèi)存棧區(qū)與堆區(qū)模型案例分析

    C++程序內(nèi)存棧區(qū)與堆區(qū)模型案例分析

    一直以來總是對這個問題的認識比較朦朧,我相信很多朋友也是這樣的,總是聽到內(nèi)存一會在棧上分配,一會又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來看看
    2022-03-03
  • c++讀寫文件流實例程序講解

    c++讀寫文件流實例程序講解

    這篇文章主要介紹了c++讀寫文件流實例,大家參考使用吧
    2013-12-12
  • C/C++指針介紹與使用詳解

    C/C++指針介紹與使用詳解

    不知從何時起對你一眼萬年,從此,每一天被賦予了特別的意義。時隔多年,依然揮之不去是你------指針?。?!本篇中幾乎數(shù)據(jù)類型只用了int,但是float、double等也是可以的
    2022-08-08
  • 詳解C++的反調(diào)試技術與繞過手法

    詳解C++的反調(diào)試技術與繞過手法

    反調(diào)試技術,惡意代碼會用它識別自身是否被調(diào)試,或者讓調(diào)試器失效,給反病毒工程師們制造麻煩,拉長提取特征碼的時間線,本章將具體總結常見的反調(diào)試基礎的實現(xiàn)原理以及如何過掉這些反調(diào)試手段,從而讓我們能夠繼續(xù)分析惡意代碼
    2021-06-06
  • C++哈希應用的位圖和布隆過濾器

    C++哈希應用的位圖和布隆過濾器

    這篇文章主要介紹了C++哈希應用的位圖和布隆過濾器的相關資料,文章內(nèi)容多以列舉試題的方式講解,感興趣的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • 弦圖ZOJ 1015 Fishing Net 判定方法

    弦圖ZOJ 1015 Fishing Net 判定方法

    弦圖,算法完全按照CDQ的PPT上給的最大勢算法(MCS)完美消除序列..需要的朋友可以參考下
    2012-11-11
  • C++結合OpenCV實現(xiàn)RRT算法(路徑規(guī)劃算法)

    C++結合OpenCV實現(xiàn)RRT算法(路徑規(guī)劃算法)

    這篇文章主要介紹了C++結合OpenCV實現(xiàn)RRT算法,RRT算法整體框架主要分為rand、near、new三點的建立和near與new之間的安全性檢查,需要的朋友可以參考下
    2022-05-05
  • C++?Protobuf實現(xiàn)接口參數(shù)自動校驗詳解

    C++?Protobuf實現(xiàn)接口參數(shù)自動校驗詳解

    用C++做業(yè)務發(fā)開的同學是否還在不厭其煩的編寫大量if-else模塊來做接口參數(shù)校驗呢?今天,我們就模擬Java里面通過注解實現(xiàn)參數(shù)校驗的方式來針對C++?protobuf接口實現(xiàn)一個更加方便、快捷的參數(shù)校驗自動工具,希望對大家有所幫助
    2023-04-04
  • C語言大廠面試技巧及strcpy()函數(shù)示例詳解

    C語言大廠面試技巧及strcpy()函數(shù)示例詳解

    這篇文章主要為大家介紹了C語言面試技巧,以strcpy()函數(shù)為示例進行分析詳解,有需要沖刺大廠的朋友們可以借鑒參考下,希望能夠有所幫助
    2021-11-11

最新評論

黑水县| 望奎县| 尼玛县| 额济纳旗| 达州市| 奉新县| 三穗县| 乡宁县| 武平县| 陵川县| 昭苏县| 鹿邑县| 蕲春县| 罗田县| 黎平县| 新化县| 忻城县| 乌恰县| 灵石县| 明水县| 河北省| 区。| 阿图什市| 洛宁县| 新沂市| 新闻| 曲靖市| 犍为县| 紫金县| 文登市| 文成县| 霞浦县| 玛曲县| 湛江市| 思南县| 北票市| 洪雅县| 光泽县| 会泽县| 会宁县| 巨野县|