欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

    // 3. 獲取目標(biāo)圖像參數(shù)(實(shí)際步長由API返回)
    int dstPitch = dstImage.GetPitch();
    BYTE* dstBits = static_cast<BYTE*>(dstImage.GetBits());
    // 5. 處理像素?cái)?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);
            // 安全寫入目標(biāo)像素
            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;
}

特殊情況使用這個(gè),這個(gè)的效果是將圖片的前8位和后8位進(jìn)行對(duì)調(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)建目標(biāo)圖像(負(fù)高度表示自上而下存儲(chǔ))
    DWORD masks[] = { 0xF800, 0x07E0, 0x001F };
    dstImage.CreateEx(width, height, 16, BI_BITFIELDS, masks);

    // 3. 獲取目標(biāo)圖像參數(shù)(實(shí)際步長由API返回)
    int dstPitch = dstImage.GetPitch();
    BYTE* dstBits = static_cast<BYTE*>(dstImage.GetBits());
    // 5. 處理像素?cái)?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);
            // 安全寫入目標(biāo)像素
            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;
}

方法補(bǔ)充

下面小編為大家整理了C++實(shí)現(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;
}

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

相關(guān)文章

  • C/C++模擬實(shí)現(xiàn)煙花效果的示例代碼

    C/C++模擬實(shí)現(xiàn)煙花效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C/C++模擬實(shí)現(xiàn)煙花效果的兩種簡(jiǎn)單方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2024-01-01
  • C語言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法

    C語言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法

    這篇文章主要介紹了C語言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 深入uCOS中全局變量的使用詳解

    深入uCOS中全局變量的使用詳解

    本篇文章是對(duì)uCOS中全局變量的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++堆排序算法實(shí)例詳解

    C++堆排序算法實(shí)例詳解

    這篇文章主要介紹了C++堆排序算法,簡(jiǎn)單分析了堆排序算法的原理并結(jié)合實(shí)例形式分析了C++實(shí)現(xiàn)堆排序的具體操作技巧,需要的朋友可以參考下
    2017-08-08
  • 探討:C++實(shí)現(xiàn)鏈?zhǔn)蕉鏄?用非遞歸方式先序,中序,后序遍歷二叉樹)

    探討:C++實(shí)現(xiàn)鏈?zhǔn)蕉鏄?用非遞歸方式先序,中序,后序遍歷二叉樹)

    本篇文章是對(duì)用C++實(shí)現(xiàn)鏈?zhǔn)蕉鏄?用非遞歸方式先序,中序,后序遍歷二叉樹)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解C語言之實(shí)現(xiàn)通訊錄

    詳解C語言之實(shí)現(xiàn)通訊錄

    這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++內(nèi)存泄漏的檢測(cè)與實(shí)現(xiàn)詳細(xì)流程

    C++內(nèi)存泄漏的檢測(cè)與實(shí)現(xiàn)詳細(xì)流程

    內(nèi)存泄漏(memory leak) 是指由于疏忽或錯(cuò)誤造成了程序未能釋放掉不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,失去了對(duì)該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi)
    2022-08-08
  • C++繼承介紹

    C++繼承介紹

    C++繼承可以是單一繼承或多重繼承,每一個(gè)繼承連接可以是public,protected,private也可以是virtual或non-virtual
    2013-01-01
  • C++二叉樹的創(chuàng)建及遍歷詳情

    C++二叉樹的創(chuàng)建及遍歷詳情

    這篇文章主要介紹了C++二叉樹的創(chuàng)建及遍歷詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-07-07
  • C++中的強(qiáng)制類型轉(zhuǎn)換操作詳解

    C++中的強(qiáng)制類型轉(zhuǎn)換操作詳解

    C++中提供了四種強(qiáng)制類型轉(zhuǎn)換技術(shù):static_cast、dynamic_cast、reinterpret_cast和const_cast。這些技術(shù)能夠在需要時(shí)將一種類型轉(zhuǎn)換為另一種類型,但需要注意它們的適用條件和安全性。程序員需要根據(jù)具體情況選擇合適的強(qiáng)制類型轉(zhuǎn)換方式,以確保程序的正確性和可靠性
    2023-04-04

最新評(píng)論