从网上下的png图片可以透明显示,自己做的png透明图片就会显示白色背景,这个png图片要怎么做?

解决方案 »

  1.   

    你自己怎么做的啊?photoshop?还是用什么?
      

  2.   

    找美工去,png图片有alpha透明通道,怎么弄我也不会。
      

  3.   

    http://hi.baidu.com/sumos/item/4e807409fa34606bd55a1163
    CImage是不能画png的,透明部分变成白色了。
    这个地址是我在百度空间写的,将CImage的像素进行了转换后绘制透明png。
      

  4.   

    cimage不支持透明通道,当然可以如楼上那样进行像素级修改
      

  5.   

    可是从网上下的一些png可以直接显示,不用做任何处理的,为什么
      

  6.   

    在画图前加入如下代码就可以实现透明:Image是CImage的对象
    if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
      {
          int i;
          int j;
          for (i=0; i<Image.GetWidth(); i++)
          {
              for (j=0; j<Image.GetHeight(); j++)
              {
                  byte *pByte = (byte *)Image.GetPixelAddress(i, j);
                  pByte[0] = pByte[0] * pByte[3] / 255;
                  pByte[1] = pByte[1] * pByte[3] / 255;
                  pByte[2] = pByte[2] * pByte[3] / 255;
              }
          }
      }
    如:
    CDC *pDC = GetDC();
     CImage Image;
     Image.Load(strPath);
     if (Image.IsNull())
     {
         MessageBox(_T("没加载成功"));
         return -1;
     }
     if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
     {
         int i;
         int j;
         for (i=0; i<Image.GetWidth(); i++)
         {
             for (j=0; j<Image.GetHeight(); j++)
             {
                 byte *pByte = (byte *)Image.GetPixelAddress(i, j);
                 pByte[0] = pByte[0] * pByte[3] / 255;
                 pByte[1] = pByte[1] * pByte[3] / 255;
                 pByte[2] = pByte[2] * pByte[3] / 255;
             }
         }
     }
     Image.Draw(pDC->m_hDC,0,0);
     Image.Destroy();
     ReleaseDC(pDC);
     
      

  7.   

    用CImage加载图片文件后加入如下代码即可实现透明:其中Image是CImage的对象
    if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
      { 
          int i;
          int j;
          for (i=0; i<Image.GetWidth(); i++)
          {
              for (j=0; j<Image.GetHeight(); j++)
              {
                  byte *pByte = (byte *)Image.GetPixelAddress(i, j);
                  pByte[0] = pByte[0] * pByte[3] / 255;
                  pByte[1] = pByte[1] * pByte[3] / 255;
                  pByte[2] = pByte[2] * pByte[3] / 255;
              }
          }
      }如:
    CDC *pDC = GetDC();
     CImage Image;
     LoadImageFromResource(&Image,IDB_PNG1,_T("PNG"));
     if (Image.IsNull())
     {
         MessageBox(_T("没加载成功"));
         return;
     }
     if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
     { 
         int i;
         int j;
         for (i=0; i<Image.GetWidth(); i++)
         {
             for (j=0; j<Image.GetHeight(); j++)
             {
                 byte *pByte = (byte *)Image.GetPixelAddress(i, j);
                 pByte[0] = pByte[0] * pByte[3] / 255;
                 pByte[1] = pByte[1] * pByte[3] / 255;
                 pByte[2] = pByte[2] * pByte[3] / 255;
             }
         }
     }
     Image.Draw(pDC->m_hDC,0,0);
     Image.Destroy();
     ReleaseDC(pDC);
      

  8.   

    这个我是不是打错了字了??我意思是你PHOTOSHOP处理透明管道方法错误
      

  9.   

    可以看看这个:http://blog.csdn.net/czyt1988/article/details/7965066
    gdi+和用CImage绘制png图片
      

  10.   

    我从网上下的透明背景png图片都可以实现透明显示
      

  11.   

    我就是看http://blog.csdn.net/zhmxy555/article/details/7422922这个做的
    他的png图片确实是可以直接显示的
    我自己做就不行
      

  12.   

    请问怎么处理才是正确的啊?我的也是成了白色背景给一段代码吧Image img(A2W(cstrTempBlankFileName));//保存路径
    Image iSourceImage(A2W(cstrTempSourceFileName));//源文件路径 Graphics graphics(&img);
    graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); ImageAttributes imageAttr;
    imageAttr.SetColorKey(Gdiplus::Color(255,255,255),Gdiplus::Color(255,255,255),Gdiplus::ColorAdjustTypeDefault);//透明像素开始-结束
    graphics.DrawImage(&iSourceImage,Gdiplus::Rect(0,0,rect.Width(),rect.Height()),0,0,rect.Width(),rect.Height(),UnitPixel,&imageAttr);
    CLSID pngClsid;
    GetEncoderClsidOwn(L"image/png",&pngClsid);
    img.Save(A2W(cstrFileName),&pngClsid,NULL);