zoukankan      html  css  js  c++  java
  • delphi JPG或BMP图片透明显示

    procedure SaveBmpAsIcon(const Bmp: TBitmap; const Icon: string; const SmallIcon: Boolean; 
    const Transparent: Boolean; const X, Y: Integer); 
    //  Bmp        : Bitmap图片 
    //  Icon      : 最终输出的icon文件全路径和文件名。如果文件已经存在则会将其覆盖 
    //  SmallIcon  : True: 16x16 图标, False: 32x32 图标 
    //  Transparent: 确定是否按照参数X,Y的坐标色生成透明图标 
    //  X, Y      : 此参数指明坐标下的色值将会作为透明色替换全图 
    var 
      PBI, MPBI: PBitmapInfo; 
      IHS, MIHS, ImageSize, MImageSize: DWord; 
      bmBuffer, MaskBuffer: Pointer; 
      TID: TIconDir; 
      TBIH: TBitmapInfoHeader; 
      Bmx, Bmm: TBitmap; 
      TranspCol: TColor; 
      I, J: Integer; 
    begin 
      Bmx:= TBitmap.Create; 
      Bmm:= TBitmap.Create; 
      try 
        if SmallIcon then 
        begin 
          Bmx.Width:= GetSystemMetrics(SM_CXSMICON); 
          Bmx.Height:= GetSystemMetrics(SM_CYSMICON); 
        end 
        else 
        begin 
          Bmx.Width:= GetSystemMetrics(SM_CXICON); 
          Bmx.Height:= GetSystemMetrics(SM_CYICON); 
        end; 
        bmx.pixelformat:=pf24bit; 
        Bmx.Canvas.StretchDraw(Rect(0, 0, Bmx.Width, Bmx.Height), Bmp); 
        TranspCol:= Bmx.Canvas.Pixels[X, Y]; 
        //TranspCol:= clWhite; 
        Bmm.Assign(Bmx); 
        Bmm.Mask(TranspCol); 
        GetDIBSizes(Bmm.Handle, MIHS, MImageSize); 
        GetDIBSizes(Bmx.Handle, IHS, ImageSize); 
        MaskBuffer:= AllocMem(MImageSize); 
        bmBuffer:= AllocMem(ImageSize); 
        MPBI:= AllocMem(MIHS); 
        PBI:= AllocMem(IHS); 
        try 
          if Transparent then 
          begin 
            for I:=0 to Bmx.Width-1 do 
              for J:=0 to Bmx.Height-1 do 
                if Bmx.Canvas.Pixels[I, J] = TranspCol then Bmx.Canvas.Pixels[I, J]:= 0; 
            with MPBI^.bmiHeader do 
            begin 
              biSize:= SizeOf(TBitmapInfoHeader); 
              biWidth:= Bmm.Width; 
              biHeight:= Bmm.Height; 
              biPlanes:= 1; 
              biBitCount:= 1; 
              biCompression:= BI_RGB; 
              biSizeImage:= MImageSize; 
              biXPelsPerMeter:= 0; 
              biYPelsPerMeter:= 0; 
              biClrUsed:= 2; 
              biClrImportant:= 2; 
            end; 
            GetDIBits(Bmm.Canvas.Handle, Bmm.Handle, 0, Bmm.height, MaskBuffer, MPBI^, DIB_RGB_COLORS); 
          end; 
          with PBI^.bmiHeader do 
          begin 
            biSize:= SizeOf(TBitmapInfoHeader); 
            biWidth:= Bmx.Width; 
            biHeight:= Bmx.Height; 
            biPlanes:= 1; 
            biBitCount:= 24; 
            biCompression:= BI_RGB; 
            biSizeImage:= ImageSize; 
            biXPelsPerMeter:= 0; 
            biYPelsPerMeter:= 0; 
            biClrUsed:= 0; 
            biClrImportant:= 0; 
          end; 
          GetDIBits(Bmx.Canvas.Handle, Bmx.Handle, 0, Bmx.Height, bmBuffer, PBI^, DIB_RGB_COLORS); 
          with TBIH do 
          begin 
            biSize:= 40; 
            biWidth:= Bmx.Width; 
            biHeight:= Bmx.Height * 2; 
            biPlanes:= 1; 
            biBitCount:= 24; 
            biCompression:= 0; 
            biSizeImage:= ImageSize; 
            biXPelsPerMeter:= 0; 
            biYPelsPerMeter:= 0; 
            biClrUsed:= 0; 
            biClrImportant:= 0; 
          end; 
          with TID do 
          begin 
            idReserved:=0; 
            idType:=1; 
            idCount:=1; 
            with idEntries[1] do 
            begin 
              bWidth:=bmx.width; 
              bHeight:=bmx.height; 
              bColorCount:=0; 
              bReserved:=0; 
              wPlanes:=1; 
              wBitCount:=24; 
              dwBytesInRes:= SizeOf(TBitmapInfoHeader) + TBIH.biSizeImage + MImageSize; 
              dwImageOffset:= 6 + TID.idCount * SizeOf(TIconDirEntry); 
            end; 
          end; 
          with TFileStream.Create(Icon, fmCreate) do 
          try 
            Write(TID, 6 + TID.idCount * SizeOf(TIconDirEntry)); 
            Write(TBIH, SizeOf(TBitmapInfoheader)); 
            Write(bmBuffer^, TBIH.biSizeImage); 
            Write(maskBuffer^, MImageSize); 
          finally 
            Free; 
          end; 
        finally 
          FreeMem(MaskBuffer); 
          FreeMem(bmBuffer); 
          FreeMem(MPBI); 
          FreeMem(PBI); 
        end; 
      finally 
        Bmx.free; 
        Bmm.free; 
      end; 
    end;
  • 相关阅读:
    #小练习 动态生成密码 分类: python 小练习 2013-08-15 16:25 314人阅读 评论(0) 收藏
    mysql中文乱码问题 分类: database 2013-08-15 14:03 330人阅读 评论(0) 收藏
    使用os.walk()方法 分类: python 小练习 2013-08-14 10:52 1465人阅读 评论(0) 收藏
    oracle 数据库转换成mysql工具:ora2mysqcn 分类: database 2013-08-14 10:21 541人阅读 评论(0) 收藏
    使用fileinput模块进行原地修改文件 分类: python 小练习 2013-08-13 16:47 618人阅读 评论(0) 收藏
    docker知识整理(备份)
    [DP] [模板] 01背包
    [模板][线段树]
    [Tree] [洛谷] P1030 求先序排列
    [Tree] [洛谷] P1087 FBI树
  • 原文地址:https://www.cnblogs.com/jijm123/p/10443020.html
Copyright © 2011-2022 走看看