none
GDI+的SAVE方法保存成PNG格式的图片,为什么把黑色当透明色去掉了? RRS feed

答案

  • Bitmap 有一个MakeTransparent 方法,可以指定任意色为透明色,你可以指定成图片中没有的一个颜色。

    另外构造时:

    Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);

    PixelFormat 可以更换一下试试看。

    感謝您的回復,我剛才研究了一下並且自己解決了。
    原來似乎DDRAW被設置KEYCOLOR的圖像的A分量被設置為了0,我把代碼改成這樣就行了。
    UINT& temp = dest_ptr[row * ddsd.lPitch /4 +col];
        pixels[row * bd.Stride / 4 + col]=(temp&0xFF000000)==0 ? temp|0xFF000000 : temp;
    • 已标记为答案 流川枫 2009年12月27日 7:57
    2009年12月27日 7:56

全部回复

  • 你好!
         请问你使用的是哪个Save方法,可以提供简单的代码吗?
    周雪峰
    2009年12月24日 3:16
    版主
  • 你好!
         请问你使用的是哪个Save方法,可以提供简单的代码吗?
    周雪峰


    int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
    { //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中
     UINT num = 0;
     UINT size = 0;
     ImageCodecInfo* pImageCodecInfo = NULL;
     GetImageEncodersSize(&num, &size);
     if(size == 0)
      return FALSE; // 编码信息不可用
     //分配内存
     pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
     if(pImageCodecInfo == NULL)
      return FALSE; // 分配失败
     //获得系统中可用的编码方式的所有信息
     GetImageEncoders(num, size, pImageCodecInfo);
     //在可用编码信息中查找format格式是否被支持
     for(UINT i = 0; i < num; ++i)
     { //MimeType:编码方式的具体描述
      if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 )
      { *pCLSID = pImageCodecInfo[i].Clsid;
      free(pImageCodecInfo);
      return TRUE;
      } } free(pImageCodecInfo);
      return FALSE;
    }

     

     CLSID pngClsid;
     GetImageCLSID(L"image/png",&pngClsid);
     DDSURFACEDESC2 ddsd;
     ddsd.dwSize = sizeof(ddsd);
     lpdds->Lock(NULL,
      &ddsd,
      DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
      NULL);
     if (ddsd.lPitch/ddsd.dwWidth==4)
     {
      UINT *dest_ptr = (UINT *)ddsd.lpSurface;
      Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);
      BitmapData bd;
      bmp.LockBits(NULL,ImageLockModeRead,PixelFormat32bppARGB,&bd);
      UINT* pixels = (UINT*)bd.Scan0;
      for(UINT row = 0; row < bd.Height; ++row)
      {
       for(UINT col = 0; col < bd.Width; ++col)
       {
        pixels[row * bd.Stride / 4 + col]=dest_ptr[row * ddsd.lPitch /4 +col];
       }
      }
      bmp.UnlockBits(&bd);
                    bmp.Save(pszLibFileW,&pngClsid,NULL);

    方便 的话加个QQ不 350773875 求教

    2009年12月24日 5:19
  • 你好!
         我目前没有QQ啊!我平时用的是MSN!
         我把这个帖子帮你移动到Visual C++版吧!让那里的专家看看,图象处理我不是很熟悉啊!担心反而误导你啊!
    周雪峰
    2009年12月24日 5:29
    版主
  • 你好!
         我目前没有QQ啊!我平时用的是MSN!
         我把这个帖子帮你移动到Visual C++版吧!让那里的专家看看,图象处理我不是很熟悉啊!担心反而误导你啊!
    周雪峰

    哦,其实这个问题很简单,只可惜我对GDI+不太熟悉。如果是在DX里,我只要关掉KEYCOLOR功能就行了,但是GDI+里不知道是哪个函数名
    2009年12月24日 5:59
  • Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);
    位图,当然没法识别透明色了。

    推荐你使用libpng。 GDI+ 对png的支持做得不是特别好。
    2009年12月24日 12:33
    版主
  • Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);
    位图,当然没法识别透明色了。

    推荐你使用libpng。 GDI+ 对png的支持做得不是特别好。

    Bitmap类应该只是存储数据的容器吧,怎样保存应该取决于编码器吧?
    如果是直接绘制到屏幕上,可以用个BITMAP类的绘制方法的参数可以设置KEYCOLOR。
    但是如果是保存的话,就不知道怎么设置了,很郁闷的说
    2009年12月25日 14:50
  • help me!

    2009年12月26日 8:31
  • Bitmap 有一个MakeTransparent 方法,可以指定任意色为透明色,你可以指定成图片中没有的一个颜色。

    另外构造时:

    Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);

    PixelFormat 可以更换一下试试看。
    2009年12月27日 0:34
    版主
  • Bitmap 有一个MakeTransparent 方法,可以指定任意色为透明色,你可以指定成图片中没有的一个颜色。

    另外构造时:

    Bitmap bmp(ddsd.dwWidth,ddsd.dwHeight,PixelFormat32bppARGB);

    PixelFormat 可以更换一下试试看。

    感謝您的回復,我剛才研究了一下並且自己解決了。
    原來似乎DDRAW被設置KEYCOLOR的圖像的A分量被設置為了0,我把代碼改成這樣就行了。
    UINT& temp = dest_ptr[row * ddsd.lPitch /4 +col];
        pixels[row * bd.Stride / 4 + col]=(temp&0xFF000000)==0 ? temp|0xFF000000 : temp;
    • 已标记为答案 流川枫 2009年12月27日 7:57
    2009年12月27日 7:56