我有一个奇怪的问题,我不认为我可以解决它。我有一个包含图层(透明 png 图像)的 ImgView,我打算将所有图层保存为 png 文件(如“保存项目”的东西),以便稍后我可以重新打开它们并将它们放在我离开它们的地方。(就像“打开项目”一样)这是我的问题,以下步骤可以正常工作:
- 我添加图层(透明的 PNG 文件)
- 我移动它们并将它们放在我想要它们的地方
- 我按保存项目(所以在这里我将所有图层保存为 png 图像文件)
- 有用
如果我执行以下步骤,则会出现问题:
- 我添加图层(透明的 PNG 文件)
- 我移动它们并将它们放在我想要它们的地方
- 我更改了图层的位置(例如:发送回一层)(所以这一步是不同的)
- 我按保存项目(所以在这里我将所有图层保存为 png 图像文件)
- 它因“模块'MyApp.exe'中地址005380FB的访问冲突。读取地址000000C0”而崩溃
现在它只给了我上面的错误,但在几次运行前,它把我指向了这一行:
procedure TCustomBitmap32.ResetAlpha(const AlphaValue: Byte);
var
I: Integer;
P: PByteArray;
begin
if not FMeasuringMode then <<<<<------ this line
因此,如果我更改图层的索引...我不能再将它们另存为 PNG ?!?!?!
这是我的保存过程:
for i:=0 to mainForm.ImgView.Layers.Count-2 do
begin
mylay := TBitmapLayer(mainForm.ImgView.Layers.Items[i]);
SaveBMPAsPng(mylay.Bitmap,'C:\MyApp\tmp\'+getLayerPan(i)+'.png');
end;
// where getLayerPan is a function that retrieves a name that I gave to the layer
... 和
procedure SaveBmpAsPng(bmp:TBitmap32;dest:string);
var
Y: Integer;
X: Integer;
Png: TPortableNetworkGraphic32;
function IsWhite(Color32: TColor32): Boolean;
begin
Result:= (TColor32Entry(Color32).B = 255) and
(TColor32Entry(Color32).G = 255) and
(TColor32Entry(Color32).R = 255);
end;
begin
bmp.ResetAlpha;
for Y := 0 to bmp.Height-1 do
for X := 0 to bmp.Width-1 do
begin
if IsWhite(bmp.Pixel[X, Y]) then
bmp.Pixel[X,Y]:=Color32(255,255,255,0);
end;
Png:= TPortableNetworkGraphic32.Create;
Png.Assign(bmp);
Png.SaveToFile(dest);
Png.Free;
end;
有什么问题?请帮忙...
编辑 我想我发现了我的问题......当我移动图层时,唯一的方法(我知道)将它清理干净,是将所有图层加载到图像列表中(TBitmap32List 是我当时的选择)和之后清理图层并以所需的顺序将它们从图像列表重新添加到我的 ImageView 中。我只能假设这是出了问题的地方。一定是因为在图层中我有透明的 PNG,当我将它们加载到 Bitmap32List 时,我将它们作为 BMP 加载。在继续之前,我必须寻找另一种方式来重组我的图层。我会用我的解决方案更新你。如果你们中的任何人知道在 ImageView32 中重新排序图层的更好方法,请告诉我。
编辑
因此,请在下图中观察 GUI 已完成并且正在工作。我有代表图层的面板,我可以移动它们(正如您在图像中看到的那样,我正在拖动图层“Elementul 0”并在链中向上移动它)。
我再说一遍,当我使用临时文件按顺序向上或向下移动图层时,我的逻辑也有效。其中一个答案建议我应该只使用 Index 属性来更改图层层次结构中的图层位置,我说如果不至少向图像添加新图层就无法完成。所以这不是一个双重问题。这只是对我收到的答案之一的回应。
谢谢