Delphi新版本虽然集成了PngImage但是分割复制什么的却非常难用.稍微封装了一下.可以把一张PNG横向分割成N张.透明通道什么的都可以保持不变.
//2013.7.22代码做了改动,变成按行和列切割.CopyPng也做了处理,可以拷贝任意区域
type
TPngArray = array of TPngImage;
{把一个PNG拷贝到另一个PNG中,带透明通道}
procedure CopyPng(const Src: TPngImage; dest: TPngImage;
const SrcX, SrcY, DestX, DestY, Width, Height: Integer);
var
p1, p2: PByteArray;
pa1, pa2: PByteArray;
sX, sY, dX, dY, s: Integer;
begin
sY := SrcY;
dY := DestY;
while sY < (SrcY + Height) do
begin
if (sY >= Src.Height) or (dY >= dest.Height) then
Break;
p1 := Src.Scanline[sY];
p2 := dest.Scanline[dY];
pa1 := Src.AlphaScanline[sY];
pa2 := dest.AlphaScanline[dY];
sX := SrcX;
dX := DestX;
while sX < (SrcX + Width) do
begin
if (sX >= Src.Width) or (dX >= dest.Width) then
Break;
p2[3 * dX] := p1[3 * sX];
p2[3 * dX + 1] := p1[3 * sX + 1];
p2[3 * dX + 2] := p1[3 * sX + 2];
pa2[dX] := pa1[sX];
//
Inc(sX);
Inc(dX);
end;
Inc(sY);
Inc(dY);
end;
end;
{分割PNG,按照行列}
function SplitePng(const Src: TPngImage; RowCount, ColCount: Integer)
: TPngArray;
var
x, y, lwidth, lHeight, xoffset, yoffset, resultIndex: Integer;
begin
SetLength(Result, RowCount * ColCount);
lwidth := Src.Width div ColCount;
lHeight := Src.Height div RowCount;
resultIndex := 0;
yoffset := 0;
for y := 0 to RowCount - 1 do
begin
xoffset := 0;
for x := 0 to ColCount - 1 do
begin
Result[resultIndex] := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, lwidth,
lHeight);
CopyPng(Src, Result[resultIndex], xoffset, yoffset, 0, 0,
Result[resultIndex].Width, Result[resultIndex].Height);
Inc(xoffset, lwidth);
//Result[resultIndex].SaveToFile(Format('d:\%d.png', [resultIndex]));
Inc(resultIndex);
end;
Inc(yoffset, lHeight);
end;
end;
你好,请问要如何调用你写的这个函数呀,本人是初学者。能不能写一小段实例呢,谢谢!
procedure TForm1.Button1Click(Sender: TObject);
var
png:Tpngimage;
begin
png:=Tpngimage.Create;
png.LoadFromFile(‘d:\cz_2.png’);
SplitePng(png,3);
end;
调用SplitePng后,要如何显示出图片呢?
调用后是存在TPngImage的数组里面的.你想怎么显示都行的啊.
比如用TImage,给Image.Picture.Graphic赋值即可.
Hallelujah! I needed this-you’re my svoiar.
And I was just wdoenirng about that too!
It’s great to read something that’s both ejnoyable and provides pragmatisdc solutions.
刚好要写个东西,用了,感觉真心不错,特来感谢,呵呵
如果png图片是24位,会出错。
png文件如果是索引文件,这样分割不行吧