图像旋转和镜像问题
我在处理图像旋转和镜像问题的时候,用pixel的赋值进行操作,发现效率很差,因此改用其它的方法,例如:scanline、bitblt等也不是很好。
不过再用stretchdraw的时候速度挺快,但是不管坐标如何定义,总是有一白边,代码如下:
//mirhorizontal:
var
bit,bitcurrent:tbitmap;
rctdraw:trect;
begin
bitcurrent.width:=bit.width ;
bitcurrent.height:= bit.height ;
rctdraw.:=0;
rctdraw.left:=bit.width;//改成bit.width-1也不行
rctdraw.bottom :=bit.height;//改成bit.height-1也不行
rctdraw.right :=0;
bitcurrent.canvas.stretchdraw(rctdraw,bit);
end;
希望各位图像旋转和镜像问题给于好的建议和方法,上面的代码能指出错误的原因。
推荐阅读
rctdraw.left:=bit.width + 1;试试
这种例子很多的到处找找一大堆
//镜像(水平翻转)
procedure mirror(jpg:tjpegimage);
var
x,y : integer;
srcrect,dstrect : trect;
bitmap1,bitmap2:tbitmap;
begin
// try
try
bitmap1:=tbitmap.create;
bitmap1.pixelformat:=pf24bit;
bitmap1.width:=jpg.width;
bitmap1.height:=jpg.height;
bitmap1.assign(jpg);
x := bitmap1.width;
y := bitmap1.height;
srcrect := rect(0,0,x,y);
dstrect := rect(x,0,0,y);
bitmap2 := tbitmap.create;
bitmap2.pixelformat:=pf24bit;
bitmap2.width := x;
bitmap2.height := y;
bitmap2.canvas.copyrect(dstrect,bitmap1.canvas,srcrect);
jpg.assign(bitmap2);
finally;
bitmap1.free;
bitmap2.free;
end;
end;
function rotatescanline90(const angle: integer;
const bitmap: tbitmap):tbitmap;
function simplecopy: tbitmap; //0
var i : integer;
j : integer;
rowin : prgbarray;
rowout: prgbarray;
begin
result := tbitmap.create;
result.width := bitmap.width;
result.height := bitmap.height;
result.pixelformat := bitmap.pixelformat; //
for j := 0 to bitmap.height - 1 do begin
rowin := bitmap.scanline[j];
rowout := result.scanline[j];
for i := 0 to bitmap.width - 1 do begin
with rowout[i] do begin
rgbtred := rowin[i].rgbtred;
rgbtgreen := rowin[i].rgbtgreen;
rgbtblue := rowin[i].rgbtblue;
end;
end;
end;
end {简单拷贝};
function rotate90degreescounterclockwise: tbitmap;
var i : integer;
j : integer;
rowin : prgbarray;
begin
result := tbitmap.create;
result.width := bitmap.height;
result.height := bitmap.width;
result.pixelformat := bitmap.pixelformat;
for j := 0 to bitmap.height - 1 do begin
rowin := bitmap.scanline[j];
for i := 0 to bitmap.width - 1 do
prgbarray(result.scanline[bitmap.width - i - 1])[j] := rowin[i]
end
end;
function rotate180degreescounterclockwise: tbitmap;
var i : integer;
j : integer;
rowin : prgbarray;
rowout: prgbarray;
begin
result := tbitmap.create;
result.width := bitmap.width;
result.height := bitmap.height;
result.pixelformat := bitmap.pixelformat; // only pf24bit for now
for j := 0 to bitmap.height - 1 do begin
rowin := bitmap.scanline[j];
rowout := result.scanline[bitmap.height - j - 1];
for i := 0 to bitmap.width - 1 do
rowout[bitmap.width - i - 1] := rowin[i]
end
end {rotate180degreescounterclockwise};
function rotate270degreescounterclockwise: tbitmap;
var i : integer;
j : integer;
rowin: prgbarray;
begin
result := tbitmap.create;
result.width := bitmap.height;
result.height := bitmap.width;
result.pixelformat := bitmap.pixelformat; // only pf24bit for now
for j := 0 to bitmap.height - 1 do begin
rowin := bitmap.scanline[j];
for i := 0 to bitmap.width - 1 do
prgbarray(result.scanline[i])[bitmap.height - j - 1] := rowin[i]
end;
end {rotate270degreescounterclockwise};
begin //主函数开始
{ if bitmap.pixelformat <> pf24bit
then raise ebitmaperror.create(仅支持24位图像);
if (angle >= 0) and (angle mod 90 <> 0)
then raise ebitmaperror.create(参数错误!);}
try
case (angle div 90) mod 4 of
0: result := simplecopy;
1: result := rotate90degreescounterclockwise; // anticlockwise for the brits
2: result := rotate180degreescounterclockwise;
3: result := rotate270degreescounterclockwise
else
result := nil // avoid compiler warning
end;
except
on eoutofresources do
messagebox(application.handle,系统资源不足!,error,mb_ok+mb_iconerror);
on eoutofmemory do
messagebox(application.handle,内存溢出!,error,mb_ok+mb_iconerror);
else
messagebox(application.handle,出现异常错误!,error,mb_ok+mb_iconerror);
end;
根据我使用的情况,scanline是效率最高的,如果你认为不行的话,试试下面两个
//利用块拷贝方法将源图片进行翻转或颠倒
function flipreversecopyrect(const flip, reverse: boolean;
const bitmap: tbitmap): tbitmap;
var bottom: integer;
left : integer;
right : integer;
: integer;
begin
result := tbitmap.create;
result.width := bitmap.width;
result.height := bitmap.height;
result.pixelformat := bitmap.pixelformat;
if flip then begin
:= bitmap.height-1;
bottom := -1
end
else begin
:= 0;
bottom := bitmap.height
end;
if reverse then begin
left := bitmap.width-1;
right := -1;
end
else begin
left := 0;
right := bitmap.width;
end;
result.canvas.copyrect(rect(left,, right,bottom),
bitmap.canvas,
rect(0,0, bitmap.width,bitmap.height));
end {flipreversecopyrect};
//利用申展方法将源图片进行翻转或颠倒
function flipreversestretchblt(const flip, reverse: boolean;
const bitmap: tbitmap): tbitmap;
var bottom: integer;
left : integer;
right : integer;
: integer;
begin
result := tbitmap.create;
result.width := bitmap.width;
result.height := bitmap.height;
result.pixelformat := bitmap.pixelformat;
if flip then begin
:= bitmap.height-1;
bottom := -1
end
else begin
:= 0;
bottom := bitmap.height
end;
if reverse then begin
left := bitmap.width-1;
right := -1;
end
else begin
left := 0;
right := bitmap.width;
end;
stretchblt(result.canvas.handle, left, , right-left, bottom-,
bitmap.canvas.handle,
0,0, bitmap.width, bitmap.height, cmsrccopy);
end {flipreversestretchblt};


讨论区