如何替换一个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是我的调色板,但是为什么不行呢?

解决方案 »

  1.   

    有一个将彩色图变为灰度图的代码,其中有调整TBitmap类的调色板,希望对你有点儿用。
    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;