[讨论] TBitmap改变大小后是如何重建Palette的? 我现在做一个小软件,用TBitmap 自动生成图片。纯黑白: PixelFormat = pf1bit当图片改变大小的时候 Palette 会发生改变,虽然看上去颜色是对的,但 ScanLine 里的内容全反了。我知道可以重设 Palette,但这个方法会浪费时间。有没有别的办法,可以在改变图片大小的时候让其自动获得想要的 Palette,比如让黑色在内存里始终为 0。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看了一个TBitmap的源码,好像似乎用PixelFormat = pf4bit 可以做到Palette不变procedure TBitmap.SetHeight(Value: Integer);var DIB: TDIBSection;begin with FImage do if FDIB.dsbm.bmHeight <> Value then begin HandleNeeded; DIB := FDIB; DIB.dsbm.bmHeight := Value; DIB.dsbmih.biHeight := Value; CopyImage(FHandle, FPalette, DIB); Changed(Self); end;end;procedure TBitmap.CopyImage(AHandle: HBITMAP; APalette: HPALETTE; DIB: TDIBSection);var NewHandle, NewPalette: THandle;begin FreeContext; NewHandle := 0; NewPalette := 0; try if APalette = SystemPalette16 then NewPalette := APalette else NewPalette := CopyPalette(APalette); NewHandle := CopyBitmap(AHandle, APalette, NewPalette, DIB, FCanvas); // 这里改变了NewPalette,CopyBitmap代码好长 NewImage(NewHandle, NewPalette, DIB, FImage.FOS2Format); except InternalDeletePalette(NewPalette); if NewHandle <> 0 then DeleteObject(NewHandle); raise; end;end;procedure TBitmap.SetPixelFormat(Value: TPixelFormat);const BitCounts: array [pf1Bit..pf32Bit] of Byte = (1,4,8,16,16,24,32);var DIB: TDIBSection; Pal: HPalette; DC: HDC; KillPal: Boolean;begin if Value = GetPixelFormat then Exit; case Value of pfDevice: begin HandleType := bmDDB; Exit; end; pfCustom: InvalidGraphic(@SInvalidPixelFormat); else FillChar(DIB, sizeof(DIB), 0); DIB.dsbm := FImage.FDIB.dsbm; KillPal := False; with DIB, dsbm, dsbmih do begin bmBits := nil; biSize := sizeof(DIB.dsbmih); biWidth := bmWidth; biHeight := bmHeight; biPlanes := 1; biBitCount := BitCounts[Value]; Pal := FImage.FPalette; case Value of pf4Bit: Pal := SystemPalette16; // 看来用pf4Bit是好主意 pf8Bit: begin DC := GDICheck(GetDC(0)); Pal := CreateHalftonePalette(DC); KillPal := True; ReleaseDC(0, DC); end; pf16Bit: begin biCompression := BI_BITFIELDS; dsBitFields[0] := $F800; dsBitFields[1] := $07E0; dsBitFields[2] := $001F; end; end; try CopyImage(Handle, Pal, DIB); PaletteModified := Pal <> 0; finally if KillPal then DeleteObject(Pal); end; Changed(Self); end; end;end; 如何获取节点所在的层次? combobox控件 怎样做才能不重复记录。 EoleException with message'发生未知错误' 大家好,我想学delphi,请问该如何入手? 为啥有时save all和run按钮同时都是灰的! 有没有办法写个软件读取美萍网管软件的记录呢?并可以删除单条记录。 关于oracle数据库中blob数据类型的保存问题???? 各位大侠帮帮忙,我有一个很急的问题,分不够可再加!!!!! 在表里面有个单号字段,00001a,请问怎样提取第五位数 初始化有必要吗? 怎样在adoquery的filter中使用in 或者类似? Delphi 事务处理的问题(急)
var
DIB: TDIBSection;
begin
with FImage do
if FDIB.dsbm.bmHeight <> Value then
begin
HandleNeeded;
DIB := FDIB;
DIB.dsbm.bmHeight := Value;
DIB.dsbmih.biHeight := Value;
CopyImage(FHandle, FPalette, DIB);
Changed(Self);
end;
end;
procedure TBitmap.CopyImage(AHandle: HBITMAP; APalette: HPALETTE; DIB: TDIBSection);
var
NewHandle, NewPalette: THandle;
begin
FreeContext;
NewHandle := 0;
NewPalette := 0;
try
if APalette = SystemPalette16 then
NewPalette := APalette
else
NewPalette := CopyPalette(APalette);
NewHandle := CopyBitmap(AHandle, APalette, NewPalette, DIB, FCanvas); // 这里改变了NewPalette,CopyBitmap代码好长
NewImage(NewHandle, NewPalette, DIB, FImage.FOS2Format);
except
InternalDeletePalette(NewPalette);
if NewHandle <> 0 then DeleteObject(NewHandle);
raise;
end;
end;procedure TBitmap.SetPixelFormat(Value: TPixelFormat);
const
BitCounts: array [pf1Bit..pf32Bit] of Byte = (1,4,8,16,16,24,32);
var
DIB: TDIBSection;
Pal: HPalette;
DC: HDC;
KillPal: Boolean;
begin
if Value = GetPixelFormat then Exit;
case Value of
pfDevice:
begin
HandleType := bmDDB;
Exit;
end;
pfCustom: InvalidGraphic(@SInvalidPixelFormat);
else
FillChar(DIB, sizeof(DIB), 0);
DIB.dsbm := FImage.FDIB.dsbm;
KillPal := False;
with DIB, dsbm, dsbmih do
begin
bmBits := nil;
biSize := sizeof(DIB.dsbmih);
biWidth := bmWidth;
biHeight := bmHeight;
biPlanes := 1;
biBitCount := BitCounts[Value];
Pal := FImage.FPalette;
case Value of
pf4Bit: Pal := SystemPalette16; // 看来用pf4Bit是好主意
pf8Bit:
begin
DC := GDICheck(GetDC(0));
Pal := CreateHalftonePalette(DC);
KillPal := True;
ReleaseDC(0, DC);
end;
pf16Bit:
begin
biCompression := BI_BITFIELDS;
dsBitFields[0] := $F800;
dsBitFields[1] := $07E0;
dsBitFields[2] := $001F;
end;
end;
try
CopyImage(Handle, Pal, DIB);
PaletteModified := Pal <> 0;
finally
if KillPal then DeleteObject(Pal);
end;
Changed(Self);
end;
end;
end;