怎么调用api函数实现图象旋转90度,180度等。(急用)(100分)

  • 主题发起人 主题发起人 flyoverXml
  • 开始时间 开始时间
XiaoCai的代码没问题的.你载入IMAGE控件的必须是BITMAP,JPEG不行的哦.
 
对,XiaoCai的代码没问题,我就这样照搬过
 
to peng_qs:

我处理的当然是BITMAP ,如果是JPEG的话,运行时当然会出错了。
 
能否加个旋转任意角度的参数?怎么做?
 
to pearl:
谢谢你上面的解释,
不过告诉你一个不好的消息,你上面的算法不是旋转90度的算法,是倒转的算法。
90旋转要两层循环啊。
为了不想算法,只好牺牲时间复杂度。
180度旋转调用两次90度旋转的算法。
 
to xiaocai & pearl :
为什么用bufferImage.canvas.copyrect()函数对象素进行操作比用scanline()函数慢得多哪?

帮我解释这一段程序吧,谢谢。
try
for y := 0 to aBitmap.Height-1 do
begin
Move(aBitmap.ScanLine[y]^, aScanLine^, nScanLineSize);
for x := 0 to aBitmap.Width-1 do
begin
nIdx := ((aBitmap.Width-1) - x) * nMultiplier;
nOfs := (x * nMemWidth * nMultiplier) +(y * nMultiplier);
for i := 0 to nMultiplier-1 do
Byte(aScnLnBuffer[nOfs + i]) := aScanLine[nIdx+i];
end;
end;
aBitmap.Height := nMemHeight;
aBitmap.Width := nMemWidth;
for y := 0 to nMemHeight-1 do
begin
nOfs := y * nMemWidth * nMultiplier;
Move((@(aScnLnBuffer[nOfs]))^, aBitmap.ScanLine[y]^, nMemWidth * nMultiplier);
end;
finally
FreeMem(aScanLine, nScanLineSize);
end;
finally
FreeMem(aScnLnBuffer, nMemSize);
end;
end;
 
有一种旋转180度的方法
I.Canvas.CopyRect(Rect(I.Width, I.Height, 0, 0), I.Canvas, Rect(0, 0, I.Width, I.Height));
很简单。
 
to Pearl:
西西,问一个私人问题:
你是mm还是gg啊,那么厉害,排名是3哦,
 
很简单,就是像素的旋转就可以搞定了!例子全在上面了!
 
to pearl:
hehe,
问一个私人问题:pearl是ppmm还是ssgg啊?
你的这次排名那么前的,那么厉害。
 
mm就不能排前面啊?
 
to pearl:
嘿嘿,如果是mm,就太好了啊,
我也没有否认不是mm哦。
 
多人接受答案了。
 
to xiaocai
你这个算法是逆时针旋转,若要顺时针旋转那该咋办?
 
要实现顺时旋转,修改
》nIdx := ((aBitmap.Width-1) - x) * nMultiplier;
》nOfs := (x * nMemWidth * nMultiplier) +(y * nMultiplier);

nIdx := x * nMultiplier;
nOfs := (x * nMemWidth * nMultiplier) +(((aBitmap.Height - 1) - y) * nMultiplier);
 
奇怪,为什么我用卷兄的算法,运行起来就很慢了,还没有用象素的快
 
后退
顶部