BitmapData bitmapData; Rect rect(0, 0, nWidth, nHeight);
bitmap.LockBits(&rect,ImageLockModeWrite,PixelFormat8bppIndexed,&bitmapData); memcpy(bitmapData.Scan0,pData,nWidth*nHeight); bitmap.UnlockBits(&bitmapData); ///////////////copy//////////////////////////// Status SaveStatus = bitmap.Save(wStr, &clsid,NULL);// &encoderParameters); if(SaveStatus != Ok) { AfxMessageBox(_T("Failed to save to stream!")); return FALSE; }} 结果 还是不行 还是24位
这个好像是GDI+做不到的 8bit的jpeg很少见 我是没有见过 GDI+估计不支持 所以只要你用Save函数保存它就会把它给弄成24位的(其实数据也已经压缩了)//You can draw the following conclusions by examining the preceding program output: //The JPEG encoder supports the Transformation, Quality, LuminanceTable, and ChrominanceTable parameter categories. //The TIFF encoder supports the Compression, ColorDepth, and SaveFlag parameter categories. 上一段引自:http://msdn.microsoft.com/en-us/library/ms533846(VS.85).aspxJpeg 编码 支持 变换 质量...这些参数 看到了吧 没有ColorDepth 所以 即便你设定了也没有用处。
SaveFile(BYTE *pData,LPCSTR lpstrname)
{
if(pData==NULL)
return FALSE;
CLSID clsid;
USES_CONVERSION;
LPWSTR wStr = A2W(lpstrname);
Bitmap bitmap(nWidth,nHeight,PixelFormat8bppIndexed);
///////////////////Palette////////////////// DWORD dwsizecolorpalette;
dwsizecolorpalette=sizeof(ColorPalette);
dwsizecolorpalette=dwsizecolorpalette+sizeof(ARGB)*(256-1); ColorPalette *ppal=(ColorPalette*)new BYTE [dwsizecolorpalette];
ASSERT(ppal);
ZeroMemory(ppal,dwsizecolorpalette); ppal->Flags=PaletteFlagsGrayScale;//灰阶
ppal->Count=256;
for(int i=0;i<256;i++)
{
BYTE alpha=0xff;
BYTE r=i;
BYTE g=i;
BYTE b=i;
ppal->Entries[i]=Color::MakeARGB(alpha,r,g,b);
} bitmap.SetPalette(ppal);
//////////////Palette/////////////////////
//////////////copy////////////////////////
BitmapData bitmapData;
Rect rect(0, 0, nWidth, nHeight);
bitmap.LockBits(&rect,ImageLockModeWrite,PixelFormat8bppIndexed,&bitmapData); memcpy(bitmapData.Scan0,pData,nWidth*nHeight); bitmap.UnlockBits(&bitmapData);
///////////////copy//////////////////////////// Status SaveStatus = bitmap.Save(wStr, &clsid,NULL);// &encoderParameters);
if(SaveStatus != Ok)
{
AfxMessageBox(_T("Failed to save to stream!"));
return FALSE;
}}
结果 还是不行 还是24位
所以只要你用Save函数保存它就会把它给弄成24位的(其实数据也已经压缩了)//You can draw the following conclusions by examining the preceding program output: //The JPEG encoder supports the Transformation, Quality, LuminanceTable, and ChrominanceTable parameter categories.
//The TIFF encoder supports the Compression, ColorDepth, and SaveFlag parameter categories. 上一段引自:http://msdn.microsoft.com/en-us/library/ms533846(VS.85).aspxJpeg 编码 支持 变换 质量...这些参数 看到了吧 没有ColorDepth 所以 即便你设定了也没有用处。