{$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,输出不透明的
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,输出不透明的
一早就放弃9X的软件开发了http://lysoft.7u7.net
2、如果二者生成的BMP文件相同,说明问题出在格式转换上。请观察转换程序是否正常,且转换程序调用的DLL版本是否相同(可以使用exeScope等工具观察应用程序调用了哪些DLL)
如果生成的BMP文件就不相同,这段代码本身是没有问题的,问题出在调用windowsAPI上,而二者的API可能接口相同,结果可能不一样。查看你编译的程序调用了哪些DLL,然后对比98和2000上的DLL版本是否相同即知(可能有很多,但可以使用排除法去观察、试验吧)。祝你好运
功能要求就像上面贴的代码一样
GetSystemPaletteEntries(tempCanvas.Handle,0,256,SysPal.lpal.palPalEntry);
Picture.Bitmap.Palette:= CreatePalette(Syspal.lpal);
这样的方式获得系统调色板~~~~~
9X和2K肯定条色板不一样~~~记得有个API就是在2K下搞半透明,说明2K的系统条色板要丰富。
的确是调色板的问题,我不懂这方面的,请问有什么办法让98下的调色板和2000下一样呢?能不能指点一下?
哦,这个我开始发贴后,发现这个错误问题了,已经改成TRANSPARENT(1)或OPAQUE(2),也试验了,结果也一样的不透明的
看一下格式对不对。可能Win9x与WinNt中的像格式可能不一样.
猜的。建议看看。
下面是偶试验的替换的代码,替换不成功,是不是写的方法不正确? //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);
。。
你先用原来的代码把图片画在image上,再写入BMP的文件头,然后做循环,写当前image的每个像素点的值即可。
BMP的格式不知道?google上搜一下吧,一大堆。