{$R *.dfm}
const
  bmpFileName = 'Happy.bmp';
  osdFileName = 'Happy.osd';procedure TForm1.Button1Click(Sender: TObject);
var
  bmp: TBitmap;
begin
  bmp := TBitmap.Create;
  bmp.PixelFormat := pf8bit;
  bmp.Width:= 500;
  bmp.Height := 200;
  bmp.Canvas.Brush.Color := clLime;       
  bmp.Canvas.FillRect(bmp.Canvas.ClipRect);  SetBkMode(bmp.Canvas.Handle, HALFTONE);  
  bmp.Canvas.Font.Color := clYellow;
  bmp.Canvas.Font.Name := '楷体_GB2312';
  bmp.Canvas.Font.Style := [fsBold];  bmp.Canvas.Font.Size := 45;
  bmp.Canvas.TextOut(10, 10, '新然科技 XinRan');  Canvas.Draw(0, 0, bmp);
  bmp.SaveToFile(bmpFileName);
  bmp.Free;end;
上面的代码在Win2000,Win98下正常,偶用生成的BMP文件[图像的背景是RGB(0,255,0)的]转换成神龙卡的OSD格式文件后输出到电视机上,输出的图像的背景在Win2000下背景是透明的,但输出的图像的背景在Win98下背景不透明。
经过多次验查,BMP格式转换成OSD格式的算法代码正常,没有错误,问题出在上面的贴出的代码中。
请高手帮看看,上面的代码在Win98或Win2000下生成的格式是不一样的吧?有什么办法让上面的方法在Win2000和Win98下生成的格式一样的?Ps。 偶试验过,用在Win2000下生成的BMP文件拿到Win98下转成OSD格式的文件,输出到TV上,背景透明,用Win98下生成的BMP文件拿到Win2000上转成OSD,输出不透明的

解决方案 »

  1.   

    这个不知道了
    一早就放弃9X的软件开发了http://lysoft.7u7.net
      

  2.   

    1、你可以在98和2000下分别生成BMP,然后进行对比,即知二者生成的文件是否相同。
    2、如果二者生成的BMP文件相同,说明问题出在格式转换上。请观察转换程序是否正常,且转换程序调用的DLL版本是否相同(可以使用exeScope等工具观察应用程序调用了哪些DLL)
      如果生成的BMP文件就不相同,这段代码本身是没有问题的,问题出在调用windowsAPI上,而二者的API可能接口相同,结果可能不一样。查看你编译的程序调用了哪些DLL,然后对比98和2000上的DLL版本是否相同即知(可能有很多,但可以使用排除法去观察、试验吧)。祝你好运
      

  3.   

    你可以在98和2000下分别生成BMP,然后进行对比,即知二者生成的文件是否相同这个我想试试,用什么工具对比吖?打开的图片看起来是没有区别的,用WinMD5看,那两个BMP的Md5值是不一样的
      

  4.   

    我现在肯定是BMP文件格式的问题,请问怎样直接用API生成图片?
    功能要求就像上面贴的代码一样
      

  5.   

    我想应该是Palette的问题,你可以通过
    GetSystemPaletteEntries(tempCanvas.Handle,0,256,SysPal.lpal.palPalEntry);
    Picture.Bitmap.Palette:= CreatePalette(Syspal.lpal);
    这样的方式获得系统调色板~~~~~
    9X和2K肯定条色板不一样~~~记得有个API就是在2K下搞半透明,说明2K的系统条色板要丰富。
      

  6.   

    TO mikespook
     的确是调色板的问题,我不懂这方面的,请问有什么办法让98下的调色板和2000下一样呢?能不能指点一下?
      

  7.   

    问楼主一声,SetBkMode中的第二个参数取值是HALFTONE(4),而查API说明,这个参数只能取值为 TRANSPARENT(1)或OPAQUE(2)。
      

  8.   

    TO  SeaWave(NoSound)
      哦,这个我开始发贴后,发现这个错误问题了,已经改成TRANSPARENT(1)或OPAQUE(2),也试验了,结果也一样的不透明的
      

  9.   

    bmp.PixelFormat := pf8bit;
    看一下格式对不对。可能Win9x与WinNt中的像格式可能不一样.
    猜的。建议看看。
      

  10.   

    偶找到一个调色板模板(Palette256.cat),请问怎样替换BMP中的调色板?
    下面是偶试验的替换的代码,替换不成功,是不是写的方法不正确?    //GetMem(bPalette, 256 * 3);
        filePalette := mmioOpen('Palette256.act', nil, MMIO_READ);
        try
            lReaded := mmioRead(filePalette, @bPalette, 3 * 256); GetMem(pPal, sizeof(LOGPALETTE)+ 256 * sizeof(PALETTEENTRY));
    if pPal <> nil then begin
    pPal.palVersion := $300;
    pPal.palNumEntries := 256;
    for nTemp := 0 to 256 do begin
    pPal.palPalEntry[nTemp].peRed := bPalette[nTemp * 3];
    pPal.palPalEntry[nTemp].peGreen := bPalette[nTemp * 3 + 1];
    pPal.palPalEntry[nTemp].peBlue := bPalette[nTemp * 3 + 2];
    pPal.palPalEntry[nTemp].peFlags := 0;
    end; hPalette := CreatePalette(pPal^);
             end;        bmp := TBitmap.Create;
            bmp.Palette := hPalette;
            bmp.PixelFormat := pf8bit;
            bmp.Width:= 500;
            bmp.Height := 200;        selectpalette(bmp.Canvas.Handle, hPalette, false);
            realizePalette(bmp.Canvas.Handle);        bmp.Canvas.Brush.Color := clLime;
            bmp.Canvas.FillRect(bmp.Canvas.ClipRect);        SetBkMode(bmp.Canvas.Handle, TRANSPARENT);
            //SetBkMode(bmp.Canvas.Handle, OPAQUE);
            bmp.Canvas.Font.Color := clYellow;
            bmp.Canvas.Font.Name := '楷体_GB2312';
            bmp.Canvas.Font.Style := [fsBold];        bmp.Canvas.Font.Size := 45;
            bmp.Canvas.TextOut(10, 10, '新然科技 XinRan');        Canvas.Draw(0, 0, bmp);
            bmp.SaveToFile(bmpFileName);
            。。
      

  11.   

    实在不行,就用笨办法:直接写BMP格式文件。这样肯定可以保证写出来的BMP格式相同了。
    你先用原来的代码把图片画在image上,再写入BMP的文件头,然后做循环,写当前image的每个像素点的值即可。
    BMP的格式不知道?google上搜一下吧,一大堆。