int Image::Save(Memory<char>& mem,LPCWSTR type,long quality){ if(_image==0) return 0; CLSID clsid; //未知原因,如果不用一个变量转换一下,type是一个常量字串的话,如果把 type 直接传给 GetImageEncoderClsid 会引起程序崩溃。 //wchar_t tp[256]; //这样也不行。 //cs::WcsCopy(tp,type); cs::String tp = type; if(!GetImageEncoderClsid(tp,&clsid)) return 0; if(quality>100) quality = 100; if(quality<0) quality = 0; Gdiplus::EncoderParameters eps; eps.Count = 1; eps.Parameter[0].Guid = Gdiplus::EncoderQuality; eps.Parameter[0].NumberOfValues = 1; eps.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong; eps.Parameter[0].Value = &quality; IStream* stream; if(FAILED(CreateStreamOnHGlobal(0,1,&stream))) return 0; if(((_Image*)_image)->Save(stream,&clsid,&eps)!=0) return 0; ULONG ws = 0; LARGE_INTEGER li; ULARGE_INTEGER npos; li.QuadPart = 0; stream->Seek(li,STREAM_SEEK_END,&npos); if(mem.Length()<npos.LowPart){ mem.SetUseSysMemory(1); if(!mem.SetLength(npos.LowPart)) return 0; } stream->Seek(li,STREAM_SEEK_SET,0); HRESULT ret = stream->Read(mem.Handle(),mem.Length(),&ws); stream->Release(); if(FAILED(ret)) return 0; return ws; }