優雅的使用libgdiplus進行圖像處理

一、準備工作

在開始使用libgdiplus進行圖像處理前,需要先進行一些準備工作。

首先,需要安裝libgdiplus庫。在Linux系統中,可以使用以下命令進行安裝:

sudo apt-get install libgdiplus

在Windows系統中,需要下載對應的二進位文件並進行安裝。

其次,還需要在代碼中引入頭文件,可以使用以下代碼進行引入:

#include &ltgdiplus.h&gt
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;

二、圖像載入

在使用libgdiplus進行圖像處理之前,需要先將圖像載入到內存中。

可以使用以下代碼進行圖像的載入:

Bitmap* bmp = new Bitmap(L"path/to/image.jpg");

其中,路徑可以是相對路徑或絕對路徑。

三、圖像處理

在圖像載入完成後,可以進行各種圖像處理操作。

四、圖像保存

處理完成後,可以將圖像保存到磁碟中。

可以使用以下代碼進行圖像保存:

bmp->Save(L"path/to/save.jpg", &clsid, NULL);

其中,路徑可以是相對路徑或絕對路徑。clsid是壓縮格式的GUID,可以使用以下代碼進行初始化:

CLSID clsid;
GetEncoderClsid(L"image/jpeg", &clsid);

GetEncoderClsid函數可以使用以下代碼進行定義:

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // number of image encoders
    UINT  size = 0;         // size of the image encoder array in bytes
    ImageCodecInfo* pImageCodecInfo = NULL;
    GetImageEncodersSize(&num, &size);
    if(size == 0)
        return -1;

    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
        return -1;

    GetImageEncoders(num, size, pImageCodecInfo);

    for(UINT j = 0; j < num; ++j)
    {
        if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;
        }
    }

    free(pImageCodecInfo);
    return -1;
}

五、功能示例

下面是一個使用libgdiplus進行圖像處理的示例代碼,包括圖像旋轉、縮放、裁剪和保存:

#include &ltiostream&gt
#include &ltgdiplus.h&gt
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // number of image encoders
    UINT  size = 0;         // size of the image encoder array in bytes
    ImageCodecInfo* pImageCodecInfo = NULL;
    GetImageEncodersSize(&num, &size);
    if(size == 0)
        return -1;

    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
        return -1;

    GetImageEncoders(num, size, pImageCodecInfo);

    for(UINT j = 0; j < num; ++j)
    {
        if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;
        }
    }

    free(pImageCodecInfo);
    return -1;
}

int main()
{
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    Bitmap* bmp = new Bitmap(L"test.jpg");
    int width = bmp->GetWidth();
    int height = bmp->GetHeight();

    // rotate
    RotateFlipType rotateFlipType = Rotate180FlipXY;
    bmp->RotateFlip(rotateFlipType);

    // resize
    int newWidth = width / 2;
    int newHeight = height / 2;
    Bitmap* bmpResize = new Bitmap(bmp, newWidth, newHeight);

    // crop
    int cropX = newWidth / 2;
    int cropY = newHeight / 2;
    int cropWidth = newWidth / 2;
    int cropHeight = newHeight / 2;
    Bitmap* bmpCrop = bmpResize->Clone(cropX, cropY, cropWidth, cropHeight, PixelFormatDontCare);
    
    // save
    CLSID clsid;
    GetEncoderClsid(L"image/jpeg", &clsid);
    bmpCrop->Save(L"output.jpg", &clsid, NULL);

    delete bmp;
    delete bmpResize;
    delete bmpCrop;

    GdiplusShutdown(gdiplusToken);

    return 0;
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/280372.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-21 13:03
下一篇 2024-12-21 13:03

相關推薦

  • 如何優雅地吃葡萄不吐葡萄皮

    要想吃葡萄不吐葡萄皮,首先要學會剝皮,然後就可以慢慢地品嘗了。 一、正確的剝皮方法 使用下面的代碼可以達到正確的剝皮方法: function peelGrape(grape) { …

    編程 2025-04-29
  • 使用boofcv進行圖像處理和機器視覺

    本文將詳細介紹使用boofcv進行圖像處理和機器視覺的方法和實踐。首先,我們將介紹boofcv的概述和安裝方法,然後分別介紹它的圖像處理、相機校準和機器學習功能。 一、概述和安裝 …

    編程 2025-04-28
  • 如何優雅地排版套打證書

    本文將從多個方面,為大家介紹如何優雅地排版套打證書,並給出相應的代碼示例。 一、選擇合適的字體 套打證書的字體必須要優雅、大方、優秀、清晰,所以應該選擇像宋體、楷體、方正、微軟雅黑…

    編程 2025-04-28
  • Matlab局部放大——圖像處理的神器

    一、什麼是Matlab局部放大? Matlab是一個高級技術計算語言和互動式環境,常被用來進行科學計算和工程設計等領域的計算和可視化操作。局部放大指對一張圖像或視頻中感興趣的區域進…

    編程 2025-04-25
  • 如何優雅地改變滑鼠指針樣式

    我們在網頁設計中,經常會遇到需要改變滑鼠指針樣式的情況,比如當我們將滑鼠移動到一個鏈接上時,我們希望滑鼠指針變成手型,這時我們就需要用到改變滑鼠指針樣式的技巧。本文將從多個方面詳細…

    編程 2025-04-25
  • FluentValidation:更優雅的驗證方法

    在軟體開發中,數據驗證是很重要的一環。我們需要保證我們的應用程序接收的數據是有效、正確的,因此我們需要一套強大的驗證庫。在這篇文章中,我們將詳細介紹 FluentValidatio…

    編程 2025-04-23
  • ifpresent——如何優雅地處理Java中的null值

    一、ifpresent的定義與特點 ifpresent是Java 8中的一個非常實用的函數,可以幫助我們優雅地處理可能為空的對象。具體來說,它可以判斷對象是否為null,如果不為n…

    編程 2025-04-23
  • highlight.js:優雅的代碼語法高亮工具

    一、基本介紹 highlight.js是一款用Javascript編寫的代碼語法高亮工具。使用它可以為你的頁面提供優雅的代碼呈現,高亮展示出不同編程語言的關鍵字、注釋、變數等內容。…

    編程 2025-04-23
  • 如何在JavaScript中優雅地跳出for循環?

    在JavaScript中,for循環是我們最常用的循環結構之一。但是有時候,我們會在循環過程中需要跳出循環,這時候怎樣才能實現優雅的跳出呢?本文將從多個方面進行詳細闡述。 一、使用…

    編程 2025-04-23
  • 優雅降級 —— 保障Web應用穩定性的重要手段

    一、概念解析 優雅降級是一種設計理念,旨在保證Web應用在遇到瀏覽器不兼容或不支持某些新特性時不崩潰,而是通過「優雅」的降級方式繼續提供基本功能給用戶體驗。 我們通常會針對現代化瀏…

    編程 2025-04-23

發表回復

登錄後才能評論