zoukankan      html  css  js  c++  java
  • 通过更改透明度使图片为透明

    使用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. //--------------------------------------------------------------------------- 
  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/lisuyun/p/3407144.html
Copyright © 2011-2022 走看看