利用GDI+与CImage处理tif(TIFF)图片,完整代码

7 篇文章 0 订阅
该代码示例展示了如何使用GDI+进行图像处理,包括从多帧TIFF图像中提取帧,对每帧图像添加文字,并保存为PNG。然后将处理后的帧重新组合成多帧TIFF文件。主要涉及GDI+的初始化、图像获取、HBITMAP转换、文本绘制以及多帧图像的保存操作。
摘要由CSDN通过智能技术生成

头文件:

// CImage;处理图片的类
#include <atlimage.h>
#include <atlstr.h>

#include<vector>
#include <iostream>
#include <stdio.h>
#include <strsafe.h>
#include <windows.h>
#include <gdiplus.h>
#pragma comment(lib, "Gdiplus.lib")
 

using namespace Gdiplus;
using namespace std;


void test8() {

    // Initialize GDI+、、初始化
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    std::wstring  wstr(L"不知道");//要显示的字体

     vector<Gdiplus::Bitmap*> bitmap;//将原来的tif提取出来,处理完再传进test3()里面从新合成tif

     GUID pageGuid = Gdiplus::FrameDimensionPage;

    CLSID encoderClsid;
    Gdiplus::Bitmap multi(L"d:\\tmp\\tif.tif");

    // Get the CLSID of the PNG encoder.
    GetEncoderClsid(L"image/png", &encoderClsid);
    int mun=multi.GetFrameCount(&pageGuid);
        // Display and save the first page (index 0).
        multi.SelectActiveFrame(&pageGuid, 0); //第一张图片

    {
        //graphics.DrawImage(&multi, 10, 10);
        Gdiplus::Color colo;
        HBITMAP hb;
        multi.GetHBITMAP(colo, &hb);//从GDI+里面拿到这帧的图片资源句柄
        CImage cimg;//借用这个类拿到图片的HDC
        /*
        也可以用这三行
        HDC hMemDC = CreateCompatibleDC(GetDC(GetDesktopWindow()));//拿到桌面的HDC
         HBITMAP hMemDC1 = (HBITMAP)SelectObject(hMemDC, hb);
         HDC imgdc =hMemDC;

         DeleteDC(hMemDC);//要放到后面
        */
        //CImage _cimg;
        //cimg.Create(multi.GetWidth(), multi.GetHeight(), 16);//转不了24位
        cimg.Attach(hb);
        HDC imgdc = cimg.GetDC();
        /开始把想画的内容画到图片里,现在的imgdc就相当于是图片
        HPEN hPen = CreatePen(PS_INSIDEFRAME, 5, RGB(255, 0, 0));
        HPEN oldPen = (HPEN)SelectObject(imgdc, hPen);
        //字体的大小和样式
        HFONT  font=CreateFont(50, 50, GM_ADVANCED, 0, 0, false, false, false, ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, NONANTIALIASED_QUALITY, DEFAULT_PITCH, NULL);
        SelectObject(imgdc, font);
        SetTextColor(imgdc, RGB(255, 255, 0));
        SetBkColor(imgdc, RGB(0, 255, 255));
        TextOut(imgdc, 300, 600, wstr.data(), wstr.length());
        bitmap.push_back(new Bitmap(cimg,NULL));//用图片资源句柄创建一个Bitmap,方便后面合成tif用到 // = (Gdiplus::Bitmap*)test7(cimg);
        bitmap[0]->Save(L"d:\\tmp\\tif0.png", &encoderClsid,NULL);//这种办法也能保存单帧图片
       // cimg.Save(L"d:\\tmp\\tif0.png");//这种办法也能保存
        cimg.ReleaseDC();//释放HDC
        cimg.Detach();
        //DeleteObject(hb);
        DeleteObject(hPen);//释放资源
        DeleteObject(font);
        DeleteObject(hb);
       
        //cimg.BitBlt(,);
   }
        // tif里的第二张图
        multi.SelectActiveFrame(&pageGuid, 1); //第二张图片
   {
       //graphics.DrawImage(&multi, 10, 10);
       //multi.Save(L"d:\\tmp\\Page0.png", &encoderClsid, NULL);
       Gdiplus::Color colo;
       HBITMAP hb;
       multi.GetHBITMAP(colo, &hb);
       CImage cimg;
       cimg.Attach(hb);
       HDC imgdc = cimg.GetDC();
       HPEN hPen = CreatePen(PS_INSIDEFRAME, 5, RGB(255, 0, 0));
       HPEN oldPen = (HPEN)SelectObject(imgdc, hPen);
       //字体的大小和样式
       HFONT font = CreateFont(50, 50, GM_ADVANCED, 0, 0, false, false, false, ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, NONANTIALIASED_QUALITY, DEFAULT_PITCH, NULL);
       SelectObject(imgdc, font);
       SetTextColor(imgdc, RGB(255, 255, 0));
       SetBkColor(imgdc, RGB(0, 255, 255));
       TextOut(imgdc, 300, 600, wstr.data(), wstr.length());
       bitmap.push_back(new Bitmap(cimg, NULL));
       //bitmap[1] = (Gdiplus::Bitmap*)test7(cimg);
       bitmap[1]->Save(L"d:\\tmp\\tif1.png", &encoderClsid, NULL);
       // cimg.Save(L"d:\\tmp\\tif0.png");
       cimg.ReleaseDC(); //
       cimg.Detach();
       //DeleteObject(hb);
       DeleteObject(hPen);
       DeleteObject(font);
       DeleteObject(hb);

       //cimg.BitBlt(,);
   }
  // Gdiplus::Bitmap* p = (Gdiplus::Bitmap*)bitmap;
   test3(bitmap);//下面有这个方法

   for (int i = 0; i < 2; i++) {

       delete bitmap[i];
   }

 GdiplusShutdown(gdiplusToken);

}

//生成tif文件
void test3(vector<Gdiplus::Bitmap*> page)
{
    // Initialize GDI+.初始化,
    //GdiplusStartupInput gdiplusStartupInput;
    //ULONG_PTR gdiplusToken;
    //GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    EncoderParameters encoderParameters;
    ULONG parameterValue;
    Status stat;

    // An EncoderParameters object has an array of
    // EncoderParameter objects. In this case, there is only
    // one EncoderParameter object in the array.
    encoderParameters.Count = 1;

    // Initialize the one EncoderParameter object.
    encoderParameters.Parameter[0].Guid = EncoderSaveFlag;
    encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
    encoderParameters.Parameter[0].NumberOfValues = 1;
    encoderParameters.Parameter[0].Value = &parameterValue;

    // Get the CLSID of the TIFF encoder.
    CLSID encoderClsid;
    GetEncoderClsid(L"image/tiff", &encoderClsid);

    // Save the first page (frame).
    parameterValue = EncoderValueMultiFrame;
    //生成的tif在d:\\tmp\\;
    stat = page[0]->Save(L"d:\\tmp\\MultiFrame.tif", &encoderClsid, &encoderParameters);
    if (stat == Ok)
        printf("Page 1 saved successfully.\n");
    for (int i = 1; i < page.size(); i++) {
        // Save the second page (frame).
        parameterValue = EncoderValueFrameDimensionPage;
        stat = page[0]->SaveAdd(page[i], &encoderParameters);
        if (stat == Ok)
            printf("Page 2 saved successfully.\n");
    }

    parameterValue = EncoderValueFlush;
    stat = page[0]->SaveAdd(&encoderParameters);
    if (stat == Ok)
        printf("File closed successfully.\n");


    // GdiplusShutdown(gdiplusToken);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值