如何替换一个Bitmap图形的Palette,并且按照现在的Palette刷新图形? hpal := CreatePalette(pal^);
if hpal <> 0 then image1.Picture.Bitmap.Palette := hpal;
image1.Picture.Bitmap.PaletteModified := True;
//selectPalette(Image1.Picture.Bitmap.Handle, hpal, TRUE);
SetPaletteEntries(Image1.Picture.Bitmap.Palette, 0, 256, pal);
RealizePalette(Image1.Picture.Bitmap.Canvas.Handle);
image1.Repaint; MyPal是我的调色板,但是为什么不行呢?
if hpal <> 0 then image1.Picture.Bitmap.Palette := hpal;
image1.Picture.Bitmap.PaletteModified := True;
//selectPalette(Image1.Picture.Bitmap.Handle, hpal, TRUE);
SetPaletteEntries(Image1.Picture.Bitmap.Palette, 0, 256, pal);
RealizePalette(Image1.Picture.Bitmap.Canvas.Handle);
image1.Repaint; MyPal是我的调色板,但是为什么不行呢?
var
bmpTemp: TBitmap;
pPal: pLogPalette;
i, nRow, nCol: integer;
byteGray: Byte;
pRGBSrc, pRGBDest: pByte;
btArrIndex: Array[0..255] of Byte;
begin
bmpTemp := TBitmap.Create;
GetMem(pPal, Sizeof(TLogPalette)+SizeOf(PaletteEntry)*256);
try
pPal.palVersion := $300;
pPal.palNumEntries := 256;
if GetPaletteEntries(bmp.Palette, 0, 255,
pPal^.palPalEntry)=0 then
begin
Result := False;
Exit;
end;
for i:= 0 to 255 do
begin
byteGray := (77*pPal^.palPalEntry[i].peRed+
151*pPal^.palPalEntry[i].peGreen +
28*pPal^.palPalEntry[i].peBlue) shr 8;
pPal^.palPalEntry[i].peRed := byteGray;
pPal^.palPalEntry[i].peGreen := byteGray;
pPal^.palPalEntry[i].peBlue := byteGray;
pPal^.palPalEntry[i].peFlags := PC_RESERVED;
btArrIndex[i] := byteGray;
end;
bmp.Palette := CreatePalette(TLogPalette(pPal^));
for i:= 0 to 255 do
//调整bmpTemp的各像素的值,并使其调色板按顺序排列,
bmpTemp.PixelFormat := pf8bit;
bmpTemp.Height := bmp.Height;
bmpTemp.Width := bmp.Width;
GetPaletteEntries(bmpTemp.Palette, 0, 255, pPal^.palPalEntry);
for i:= 0 to 255 do
begin
pPal^.palPalEntry[i].peRed := i;
pPal^.palPalEntry[i].peGreen := i;
pPal^.palPalEntry[i].peBlue := i;
pPal^.palPalEntry[i].peFlags := PC_RESERVED;
end;
bmpTemp.Palette := CreatePalette(TLogPalette(pPal^));
for nRow:= 0 to bmp.Height-1 do
begin
pRGBSrc := bmp.ScanLine[nRow];
pRGBDest := bmpTemp.ScanLine[nRow];
for nCol := 0 to bmp.Width -1 do
begin
pRGBDest^ := btArrIndex[pRGBSrc^];
Inc(pRGBSrc);
Inc(pRGBDest);
end;
end;
bmp.Assign(bmpTemp);
finally
FreeMem(pPal);
bmpTemp.Free;
end;
Result := true;
end;