[图像] 利用gdip半透明贴图

Mr_MAO 9天前 202

gdip实现透明度比较简单,可以利用gdip的colorMatrix来设置图片的透明度。

具体实现是:导入gdip.imageAttributes库,并实例化一个colorMatri属性表"attr";然后关联一个带透明通道的指定值的属性表"attr_alpha",再通过bmp.copy(attr)应用到bmp中即可返回带透明度的bitmap。

以下是一个示例:

Code AardioLine:63复制
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
    • //半透明贴图(修改图片的不透明度)
    • import win.ui;
    • /*DSG{{*/
    • var winform = win.form(text="gdip半透明贴图";right=839;bottom=556;composited=1;max=1)
    • winform.add(
    • static={cls="static";text="不透明度:";left=21;top=517;right=85;bottom=546;align="right";center=1;db=1;dl=1;transparent=1;z=1};
    • static2={cls="static";text="100%";left=760;top=520;right=824;bottom=549;align="center";center=1;db=1;dr=1;transparent=1;z=2};
    • trackbar={cls="trackbar";left=87;top=517;right=744;bottom=547;db=1;dl=1;dr=1;max=100;min=0;z=3}
    • )
    • /*}}*/
    • winform.trackbar.setRange(0,255);
    • winform.trackbar.pos = 255;
    • import gdip.bitmap; import inet.http;
    • var bmp1 = gdip.bitmap("https://cdn.mos.cms.futurecdn.net/ARWms77gyVZ5u2MZkQqcKc-400-80.jpg");
    • var bmp2 = gdip.bitmap("https://freegifimg.com/download/zebras/210162-zebra-gif-free-photo.gif");
    • import gdip.imageAttributes;
    • var attr = gdip.imageAttributes() //colorMatri属性表
    • var attr_alpha = {
    • 1,0,0,0,0,
    • 0,1,0,0,0,
    • 0,0,1,0,0,
    • 0,0,0,1/*这个是控制透明度的*/,0,
    • 0,0,0,0,1
    • }
    • winform.onDrawBackground = function(hdc,rc){
    • //贴bmp1
    • var g = gdip.graphics(hdc);
    • g.drawImageStretch(bmp1, rc.expand(0,-(rc.height()-winform.trackbar.top)));
    • //按透明度贴bmp2
    • attr.setColorMatrix(attr_alpha); //设置为colorMatrix
    • bmp2_X, bmp2_Y = (rc.right-bmp2.width)/4, winform.trackbar.top-bmp2.height-20;
    • g.fastDrawBitmap(bmp2.copy(attr), bmp2_X, bmp2_Y) ; //应用colorMatrix贴图
    • }
    • winform.adjust = function( cx,cy,wParam ) {
    • owner.redrawBackground();
    • };
    • //移动滑块,修改图片不透明度
    • winform.trackbar.oncommand = function(id,event,pos){
    • if( event == 8/*_SB_ENDSCROLL*/ ){
    • attr_alpha[19] = winform.trackbar.pos/255; //修改不透明度 0 ~ 1
    • winform.static2.text = math.round(winform.trackbar.pos*100/255) ++ "%";
    • winform.invalidate(::RECT(bmp2_X,bmp2_Y,bmp2_X+bmp2.width,bmp2_Y+bmp2.height), true);
    • winform.redrawBackground();
    • return;
    • }
    • if(pos % 5 == 0){
    • attr_alpha[19] = pos/255; //修改不透明度 0 ~ 1
    • winform.static2.text = math.round(pos*100/255) ++ "%";
    • winform.invalidate(::RECT(bmp2_X,bmp2_Y,bmp2_X+bmp2.width,bmp2_Y+bmp2.height), true);
    • winform.redrawBackground();
    • }
    • }
    • winform.show();
    • win.loopMessage();


    运行效果↓

    最新回复 (7)
    • wx 9天前
      0 2
      强图片
    • 光庆 8天前
      0 3
      Code AardioLine:36复制
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    • 9.
    • 10.
    • 11.
    • 12.
    • 13.
    • 14.
    • 15.
    • 16.
    • 17.
    • 18.
    • 19.
    • 20.
    • 21.
    • 22.
    • 23.
    • 24.
    • 25.
    • 26.
    • 27.
    • 28.
    • 29.
    • 30.
    • 31.
    • 32.
    • 33.
    • 34.
    • 35.
    • 36.
      • //半透明贴图(修改图片的不透明度)
      • import win.ui;
      • /*DSG{{*/
      • var winform = win.form(text="gdip半透明贴图";right=839;bottom=556;composited=1)
      • winform.add(
      • static={cls="static";text="不透明度:";left=20;top=510;right=84;bottom=550;align="right";center=1;db=1;dl=1;transparent=1;z=1};
      • static2={cls="static";text="100%";left=760;top=510;right=824;bottom=550;align="center";center=1;db=1;dr=1;transparent=1;z=2};
      • trackbar={cls="trackbar";left=100;top=510;right=757;bottom=540;db=1;dl=1;dr=1;max=100;min=0;pos=100;z=3}
      • )
      • /*}}*/
      • import inet.http;
      • var bmp1 = gdip.bitmap("https://cdn.mos.cms.futurecdn.net/ARWms77gyVZ5u2MZkQqcKc-400-80.jpg");
      • var bmp2 = gdip.bitmap("https://freegifimg.com/download/zebras/210162-zebra-gif-free-photo.gif");
      • import godking.paint
      • winform.onDrawBackground = function(hdc,rc){
      • var p = godking.paint.fromHdc(hdc);
      • p.drawImage(rc /*绘制范围RECT*/,bmp1/*图片*/,/*透明度或图片属性*/,/*保持比例*/);
      • p.drawImage(rc.inflate(-150,-150).offset(-100,100) /*绘制范围RECT*/,bmp2/*图片*/,winform.trackbar.pos/100/*透明度或图片属性*/,true/*保持比例*/);
      • p.close();
      • }
      • winform.adjust = function( cx,cy,wParam ) {
      • owner.redrawBackground();
      • };
      • //移动滑块,修改图片不透明度
      • winform.trackbar.oncommand = function(id,event,pos){
      • if( event == 8/*_SB_ENDSCROLL*/ ){
      • winform.redrawBackground();
      • }
      • }
      • winform.show();
      • win.loopMessage();


    • 近我者赤 8天前
      0 4

    • Mr_MAO 8天前
      0 5

       ,庆大的代码简洁有力,功底深厚,代码非常恰当的体现了封装的优势!!
      高手出招,代码少,效果好!! 非常厉害 


    • 近我者赤 8天前
      0 6
      event == 8 改为 event == 5 即时透明化
    • 光庆 8天前
      0 7
      近我者赤 event == 8 改为 event == 5 即时透明化
      可改为 if( event==5 or event==8 )
    • shzhbook 6天前
      0 8
      厉害的,希望能多分享和实际应用相关所有技术,看楼主、光庆、还有其他等牛人的代码能学到不少,感谢分享。
    返回