头文件:
// 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 = ¶meterValue;
// 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);
}