• 通过更改透明度使图片为透明


    使用AlphaBlend函数

    函数功能

    函数用来显示具有指定透明度的图像。

    函数原型

    AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunction);

    参数

    hdcDest:指向目标设备环境的句柄。
    nXoriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。
    nYOriginDest:指定目标矩形区域左上角的Y轴坐标,按逻辑单位。
    nWidthDest:指定目标矩形区域的宽度,按逻辑单位。
    hHeightdest:指向目标矩形区域的高度,按逻辑单位。
    hdcSrc:指向源设备环境的句柄。
    nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。
    nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。
    nWidthSrc:指定源矩形区域的宽度,按逻辑单位。
    nHeightSrc:指定源矩形区域的高度,按逻辑单位。
    blendFunction:指定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。
    最后一个参数blendFunction是一个BLENDFUNCTION结构。BLENDFUNCTION结构控制源和目标位图的混合方式,它的BlendOp字段指明了源混合操作,但只支持AC_SRC_OVER,即根据源alpha值把源图像叠加到目标图像上。OpenGL的alpha混合还支持其他的方式,如常量颜色源。下一个字段BlendFlags必须是0,也是为以后的应用保留的。最后一个字段AlphaFormat有两个选择:0表示常量alpha值,AC_SRC_ALPHA表示每个像素有各自的alpha通道。
    函数编辑

    函数编辑

    2运用

    1.如果AlphaFormat字段为0,源位图中的所有像素使用同样的常量alpha值,即SourceConstantAlpha字段中的值,该值实际上是0和255,而不是0和1。这里0表示完全透明,255表示完全不透明。目标像素以255-SourceConstantAlpha值作为alpha值。
    2. 如果AlphaFormat字段的值是AC_SRC_ALPHA,源设备表面的每个像素必须有各自的alpha通道。即,必须是32-bpp的物理设备上下文,或是选中了32-bpp DDB和DIB段的内存设备上下文。这些情况下,每个源像素有4个8位通道:红、绿、蓝和alpha。每个像素的alpha通道和SourceConstantAlpha字段一起用于把源和目标混合起来。实际用于计算的运算式如下:
    Tmp.Red = Src.Red * SourceConstantAlpha / 255;
    Tmp.Green = Src.Green * SourceConstantAlpha / 255;
    Tmp.Blue = Src.Blue * SourceConstantAlpha / 255;
    Tmp.Alpha = Src.Alpha * SourceConstantAlpha / 255;
    Beta = 255 – Tmp.alpha;
    Dst.Red = Tmp.Red + Round((Beta * Dst.Red )/255);
    Dst.Green = Tmp.Green + Round((Beta * Dst.Green)/255);
    Dst.Blue = Tmp.Blue + Round((Beta * Dst.Blue )/255);
    Dst.Alpha = Tmp.Alpha + Round((Beta * Dst.Alpha)/255);

    返回值

    如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。
    Windows NT:若想获取更多错误信息,请调用GetLastError函数
    解决像素问题

    解决像素问题

    备注

    如果源矩形区域与目标矩形区域大小不一样,那么将缩放源位图与目标矩形区域匹配。如果使用SetStretchBltMode函数,那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,在本函数中,iStretchMode的值自动转换成COLORONCOLOR。目标坐标使用为目标设备环境当前指定的转换方式进行转换。源坐标则使用为源设备环境指定的当前转换方式进行转换。如果源设备环境标识为增强型图元文件设备环境,那么会出错(并且该函数返回FALSE)。如果目标和源位图的色彩格式不同,那么AlphaBlend将源位图转换以匹配目标位图。
    AlphaBlend不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。
     
     

    C++Builder 加载图片 设置图片的透明度

    1. #include <vcl.h>  
    2. #pragma hdrstop  
    3. #include "Unit1.h"  
    4. //---------------------------------------------------------------------------  
    5. #pragma package(smart_init)  
    6. #pragma resource "*.dfm"  
    7. TForm1 *Form1;  
    8. Byte  Transparency ; //透明度  
    9. Graphics::TBitmap *Bit,*BitBack;  
    10. //---------------------------------------------------------------------------  
    11. __fastcall TForm1::TForm1(TComponent* Owner)  
    12.     : TForm(Owner)  
    13. {  
    14. }  
    15. //---------------------------------------------------------------------------  
    16. void __fastcall TForm1::FormCreate(TObject *Sender)  
    17. {  
    18.   BitBack =new  Graphics::TBitmap();  
    19.   BitBack->LoadFromFile("c://1.bmp");  
    20.   Brush->Bitmap = BitBack;  
    21.   
    22.   Bit =new Graphics::TBitmap();  
    23.   Bit->LoadFromFile("c://2.bmp");  
    24. }  
    25. //---------------------------------------------------------------------------  
    26. void __fastcall TForm1::Button2Click(TObject *Sender)  
    27. {  
    28.    TBlendFunction    Blend;  
    29.    Blend.BlendOp = AC_SRC_OVER;  
    30.    Blend.BlendFlags = 0;  
    31.    Blend.AlphaFormat = 0;  
    32.    Transparency = 100 ;  //透明度  
    33.    Blend.SourceConstantAlpha = Transparency;  //设置透明度  
    34.    ::AlphaBlend(Canvas->Handle,  
    35.                      10,  
    36.                      10,  
    37.                      Bit->Width + 10,  
    38.                      Bit->Height + 10,  
    39.                      Bit->Canvas->Handle,  
    40.                      0,  
    41.                      0,  
    42.                      Bit->Width,  
    43.                      Bit->Height,  
    44.                      Blend  
    45.                      );  
    46. }  
    47. //---------------------------------------------------------------------------  
    48. void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)  
    49. {  
    50.   delete Bit;  
    51.   delete BitBack;  
    52. }  
    53. //--------------------------------------------------------------------------- 
  • 相关阅读:
    RedHat 7.0及CentOS 7.0禁止Ping的三种方法
    修改WordPress后台默认登陆地址提高网站安全性
    解决WordPress用户名密码都正确但点击登陆就清空密码的问题
    Windows上使用Git托管代码到Coding
    使用Coding Pages托管网站
    Windows上设置Mozilla Thunderbird邮件客户端后台运行
    在VirtualBox中安装BlackArch Linux
    关于XML学习
    软件工程课程设计团队项目总结与项目报告
    详细设计
  • 原文地址:https://www.cnblogs.com/lisuyun/p/3407144.html
Copyright © 2020-2023  润新知