⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit3.cpp

📁 本书《C++Builder与WindowsAPI经典范例》附含配套光盘包括132个WindowsAPI函数及206个完整、可执行的实例
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
//将Image1隐藏并当作来源图像
Image1->Hide();
//创建一图像,作为转换成果
image2 = new TImage(this);
image2->Parent = Form1;
image2->Picture->Bitmap->Assign(Image1->Picture->Bitmap);
image2->Stretch = true;
image2->Align = alClient;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
//关闭程序前,释放image2所占住内存
delete image2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//自定义函数--转换图文件色彩
BitmapCover(Image1->Picture->Bitmap,ComboBox1->Text.ToInt());
}
//---------------------------------------------------------------------------
//自定义函数--转换图文件色彩
void __fastcall TForm1::BitmapCover(Graphics::TBitmap *Bitmap,int bpp)
{
const int AWidth = Bitmap->Width;
const int AHeight = Bitmap->Height;
//图像结构声明,并清理此内存
BITMAPINFO bmi;
::ZeroMemory(&bmi, sizeof(BITMAPINFO));

//设置BITMAPINFO(HEADER)结构成员
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = AWidth;
bmi.bmiHeader.biHeight = -AHeight;
bmi.bmiHeader.biPlanes = 1;
//由用户设置此图像位数
bmi.bmiHeader.biBitCount = (WORD)bpp;
bmi.bmiHeader.biCompression = BI_RGB;

//若为8位以下图像,则自行指定设置前三代替色
//图像经由BitBlt函数,取代最接近色彩
RGBQUAD rgb1 = {50, 50, 50, 0};///深灰色
RGBQUAD rgb2 = {235, 235, 235, 0};//浅灰色
RGBQUAD rgb3 = {255, 230, 140, 0};//铭黄色
bmi.bmiColors[0] = rgb1;
bmi.bmiColors[1] = rgb2;
bmi.bmiColors[2] = rgb3;

//在内存中创建一图像,返回handle与此图像区块指针
unsigned char *mapbits;
HBITMAP HBmp =
        ::CreateDIBSection(0, &bmi, DIB_RGB_COLORS,
                   reinterpret_cast<void **>(&mapbits),
                   NULL, NULL);

if (HBmp)
   {
   //与GDI同步执行
   ::GdiFlush();
   //在内存中创建一兼容DC handle
   HDC Hdc = ::CreateCompatibleDC(0);
   //先将设置好的新图像DC handle传入此兼容DC handle中
   HBITMAP HOldBitmap = ::SelectObject(Hdc, HBmp);
   //再将Image1 DC handle传入,作最适化结合转换
   ::BitBlt(Hdc, 0, 0,
            AWidth, AHeight,
            Bitmap->Canvas->Handle,
            0, 0,
            SRCCOPY);
   //回复兼容DC原有结构设置
   ::SelectObject(Hdc, HOldBitmap);
   //释放此相容DC
   ::DeleteDC(Hdc);
   //将最适化结果返回image2
   image2->Picture->Bitmap->Handle = HBmp;
   }
}
//---------------------------------------------------------------------------




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -