另外说到速度较慢我也感到了,有些比较难办,比如快速生成缩略图,这个各种格式要分开处理~~~一般就是只对部分数据进行取样生成缩略图(因为生成缩略图本身也要丢弃大量像素点信息),还有就是理由某些格式的特殊地方,如部分JPEG格式本身含有缩略图,还有像PCD含有五张图,就读最小那张(192 X 128),这样处理量小很多~~~
像放大缩小要快点就容易多了,你不需要用API对位图本身进行放缩(我猜的),只需要在绘制的时候放缩就行了,简单点说,比如设置Image控件的Stretch=True,直接调整Image控件的大小!
而像水平/垂直翻转慢,我猜你是不是逐个像素处理呢?其实像垂直翻转,可以直接按行进行内存数据的交换啊~~~
给些示例代码:
//水平翻转
procedure FlipHorz(const Bitmap:TBitmap);
var
i, j: Integer;
row1, row2, rowRGB: pRGBTriple;
Width, Height: Integer;
begin
Width := Bitmap.Width;
Height := Bitmap.Height;
GetMem(rowRGB, 3);
for j := 0 to Height - 1 do
begin
row1 := Bitmap.ScanLine[j];
row2 := row1;
Inc(row2, Width - 1);
for i := 0 to (Width div 2) - 1 do
begin
rowRGB^ := row1^;
row1^ := row2^;
row2^ := rowRGB^;
Inc(row1);
Dec(row2);
end;
end;
FreeMem(rowRGB);
end;
//垂直翻转
procedure FlipVert(const Bitmap:TBitmap);
var
i, j: Integer;
row1, row2, rowRGB: pRGBTriple;
Width, Height: Integer;
begin
Height := Bitmap.Height;
Width := Bitmap.Width;
GetMem(rowRGB, Width * 3);
for j := 0 to (Height div 2) - 1 do
begin
row1 := Bitmap.ScanLine[j];
row2 := Bitmap.ScanLine[Height - j -1];
CopyMemory(rowRGB, row1, Width * 3);
CopyMemory(row1, row2, Width * 3);
CopyMemory(row2, rowRGB, Width * 3);
end;
FreeMem(rowRGB);
end;