如何获取和设置一个256色位图(TBitmap)中调色版第i项的颜色?(200分)

  • 主题发起人 主题发起人 mattress
  • 开始时间 开始时间
to mattress :

//在设计期间加载一幅图象于Image1上

procedure TForm1.Button1Click(Sender: TObject);
var
Bmp :TBitmap;
pal :pMaxLogPalette;
palEntryNum :Integer;
r,g,b :Byte;
begin
Bmp :=TBitmap.Create;
Bmp.Assign(Image1.Picture.Bitmap);
Bmp.PixelFormat :=pf8bit; //256色
SelectPalette(Bmp.Canvas.Handle,BmP.Palette,False);
RealizePalette(Bmp.Canvas.Handle);
pal.palVersion :=$0300;
pal.palNumEntries :=256;
GetMem(pal,SizeOf(TLOGPALETTE)+255*SizeOf(TPALETTEENTRY));
palEntryNum :=GetPaletteEntries(Bmp.Palette,0,255,pal.palpalEntry);
r :=pal.palpalEntry[15].peRed; //得到索引号为15对应的颜色
g :=pal.palpalEntry[15].peGreen;
b :=pal.palpalEntry[15].peBlue;
Edit1.Text :=IntToStr(r);
Edit2.Text :=IntToStr(g);
Edit3.Text :=IntToStr(b);
end;
 
获取 Bitmap Palette 中第 Index 项颜色到 Color 中,返回值为 False 则失败:
function GetBmpPaletteColor(Bitmap: TBitmap; Index: Byte; var Color: TColor): Boolean;
var
HPal: HPALETTE;
PaletteEntry: TPaletteEntry;
begin
Result := False;
if BitMap.Empty then
exit;
HPal := CopyPalette(BitMap.Palette);
if HPal <> 0 then
begin
if GetPaletteEntries(HPal, Index, 1, PaletteEntry) <> 0 then
begin
Color := (PaletteEntry.peRed shl 16) or (PaletteEntry.PeGreen shl 8) or PaletteEntry.peBlue;
Result := True;
end;
end;
HPal := 0;
end;
 
《程序员大本营2000》里有控件ColorPallete,你去取来安一个吧
 
不必这么麻烦,
procedure SetRgb(x,y,z:byte;Index:byte);
var
Bi:BITMAPINFOHEADER;
bf:BITMAPFILEHEADER;
Bmp :TBitmap;
mem:TmemoryStream;
begin
bmp:=Tbitmap.Create;
mem:=TmemoryStream.create;
bmp.loadfromFile('c;/1.bmp');
bmp.savetoStream(mem);
mem.seek(Sizeof(Bi)+Sizeof(bf)+3*(index-1),0);
mem.Write(x,1);
mem.Write(y,1);
mem.Write(z,1);
mem.SavetoFile('C;/2.bmp');
mem.Free;
bmp.Free;
end;
 
其中,X,Y,Z分别代表RGB的三个分量,INDEX代表要修改的第几项
 
获得颜色如下:其中,X,Y,Z分别代表RGB的三个分量,INDEX代表要修改的第几项

procedure GetRgb(var x,y,z:byte;Index:byte);
var
Bi:BITMAPINFOHEADER;
bf:BITMAPFILEHEADER;
Bmp :TBitmap;
mem:TmemoryStream;
begin
bmp:=Tbitmap.Create;
mem:=TmemoryStream.create;
bmp.loadfromFile('c;/1.bmp');
bmp.savetoStream(mem);
mem.seek(Sizeof(Bi)+Sizeof(bf)+3*(index-1),0);
mem.Read(x,1);
mem.read(y,1);
mem.Read(z,1);
mem.Free;
bmp.Free;
end;
 
多人接受答案了。
 
后退
顶部