Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TBitmap.SaveToFile正在更改位图_Delphi_Delphi 10.3 Rio - Fatal编程技术网

Delphi TBitmap.SaveToFile正在更改位图

Delphi TBitmap.SaveToFile正在更改位图,delphi,delphi-10.3-rio,Delphi,Delphi 10.3 Rio,我使用Delphi10.3 这段代码运行得很好。它加载带有alpha通道的32位BMP,并以适当的透明度显示: Bmp := TBitmap.Create; Bmp.AlphaFormat := afDefined; Bmp.LoadFromFile('bbb.bmp'); Image1.Picture.Assign(Bmp); Bmp.SaveToFile('uuu.bmp'); Bmp := TBitmap.Create; Bmp.AlphaFormat := afDefine

我使用Delphi10.3

这段代码运行得很好。它加载带有alpha通道的32位BMP,并以适当的透明度显示:

Bmp := TBitmap.Create;
Bmp.AlphaFormat := afDefined;
Bmp.LoadFromFile('bbb.bmp');    

Image1.Picture.Assign(Bmp);

Bmp.SaveToFile('uuu.bmp');
Bmp := TBitmap.Create;
Bmp.AlphaFormat := afDefined;
Bmp.LoadFromFile('bbb.bmp');

Bmp.SaveToFile('uuu.bmp'); 
Image1.Picture.Assign(Bmp);
但这一准则消除了透明度:

Bmp := TBitmap.Create;
Bmp.AlphaFormat := afDefined;
Bmp.LoadFromFile('bbb.bmp');    

Image1.Picture.Assign(Bmp);

Bmp.SaveToFile('uuu.bmp');
Bmp := TBitmap.Create;
Bmp.AlphaFormat := afDefined;
Bmp.LoadFromFile('bbb.bmp');

Bmp.SaveToFile('uuu.bmp'); 
Image1.Picture.Assign(Bmp);
为什么?

我甚至为pf32编写了自己的保护程序:

type TBitmap = class(Vcl.Graphics.TBitmap)
       procedure SaveToFile2(Filename: String);
       procedure LoadFromFile2(Filename: String);
     end;
     PCardinalArray = ^TCardinalArray;
     TCardinalArray = array[0..32767] of Cardinal;

...

procedure TBitmap.SaveToFile2(Filename: String);
var Head: array[0..53] of Byte;
    F: TFileStream;
    Size: Integer;
    P: PCardinalArray;
    y: Integer;
begin
  Size := Width*Height*4 + 54;

  FillChar(Head, 54, 0);

  Head[0] := $42;
  Head[1] := $4D;

  Head[2] := Size and $FF;
  Head[3] := (Size shr 8) and $FF;
  Head[4] := (Size shr 16) and $FF;
  Head[5] := Size shr 24;

  Head[6] := 0;
  Head[7] := 0;
  Head[8] := 0;
  Head[9] := 0;

  Head[10] := 54;
  Head[11] := 0;
  Head[12] := 0;
  Head[13] := 0;

  Head[14] := 40;
  Head[15] := 0;
  Head[16] := 0;
  Head[17] := 0;

  Head[18] := Width and $FF;
  Head[19] := (Width shr 8) and $FF;
  Head[20] := (Width shr 16) and $FF;
  Head[21] :=  Width shr 24;

  Head[22] := Height and $FF;
  Head[23] := (Height shr 8) and $FF;
  Head[24] := (Height shr 16) and $FF;
  Head[25] := Height shr 24;

  Head[26] := 1;
  Head[27] := 0;

  Head[28] := 32;
  Head[29] := 0;

  Head[38] := $12;
  Head[39] := $0B;
  Head[40] := 0;
  Head[41] := 0;

  Head[42] := $12;
  Head[43] := $0B;
  Head[44] := 0;
  Head[45] := 0;

  F := TFileStream.Create(Filename, fmCreate or fmShareDenyWrite);
  F.Write(Head[0], 54);

  for y:=Self.Height-1 downto 0 do begin
    P := Self.ScanLine[y];
    F.Write(P[0], Self.Width*4);
  end;

  F.Free;
end;
我还为PF32位编写了自己的加载程序:

procedure TBitmap.LoadFromFile2(Filename: String);
var Head: array[0..53] of Byte;
    F: TFileStream;
    P: PCardinalArray;
    y: Integer;
begin
  F := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);

  FillChar(Head, 54, 0);
  F.Read(Head[0], 54);

  if (F.Size < 54) or (Head[0] <> $42) or (Head[1] <> $4D) or (Head[10] <> 54) or (Head[28] <> 32) then begin
    F.Free;
    Exit;
  end;

  Self.Width := Head[18] + (Head[19] shl 8) + (Head[20] shl 16) + (Head[21] shl 24);
  Self.Height := Head[22] + (Head[23] shl 8) + (Head[24] shl 16) + (Head[25] shl 24);
  Self.PixelFormat := pf32bit;
  Self.AlphaFormat := afIgnored;

  for y:=Self.Height-1 downto 0 do begin
    P := Self.ScanLine[y];
    F.Read(P[0], Self.Width*4);
  end;

  Self.AlphaFormat := afDefined;
  F.Free;
end;

因此,这似乎不会改变位图的渲染方式,但实际上会改变位图并重新计算像素。这能避免吗?我想要一个以alpha透明显示的位图,但我希望所有像素保持不变,就像它们在文件中一样。

在的Embarcadero文档中,透明颜色设置为位图图像数据中的第一个像素。也许问题就在那里。程序以这种方式重新加载图片

也许此代码将帮助您找到问题:

是否在保存过程中更改了
像素格式?你需要保存的文件来保持透明度,还是只需要
TImage
?@RemyLebeau基本上我想要一个可靠的位图,没有我的许可,不会进行任何转换。TransparentColor用于非alpha透明度。