-
stamf
2008-09-01
-
你好,上次问的有关矩形的多边形变形问题,如果直接用你说的那个方法没办法解决。
我思考了一下要解决这个问题必须要使用矩阵变换,如果简单的把两个图像变换成菱形然后拼接,看起来非常怪异。
矩阵变换以后还要进行插值,我做了一个变换算法,但是效率很差,不知道你有没有一些比较高效的算法?
我做了一个简单的梯形变形算法,是这样的:
做一个逐列循环,每一列先计算好形变后的长度,在另一个画布中按照形变后的长度和位置画出这一列。(按列形变以后计算插值就比较容易)
这样做效果不错,但是速度很慢,效率低,能不能麻烦你用汇编实现一下呢?
-
阿发伯
回复于
2008-09-10
-
既然你已经做了梯形变形算法,所需要的只是一个效率和质量较高的插值过程,我的BLOG文章《GDI+在Delphi的应用 - Photoshop浮雕效果》中有二次线性插值颜色的代码,你可以参照一下,大致流程如下:
1、先用GetExpandData扩展图像边缘,那个Radius用个2就应该行了
2、把你的算法转换为65536倍数的整数,计算出梯形图每个象素点在原图的扩大了65536位置x,y,3、调用GetBilinearColor取得象素颜色,设置在梯形图的当前位置即可
-
呼呼
2008-07-16
-
首先感谢你的大作,收益匪浅。现在想请教一个问题,在生成多帧Tiff时,怎么指定它的压缩格式啊。<br />Parameters.Count的值虽然可以指定为>1 ,但Parameter只可以为一个。<br />谢谢!
-
严卫强
2008-07-14
-
倒,不能换行。郁闷...
-
严卫强
2008-07-14
-
发博,以及各位发博的好友们:<BR><br /><BR><br />请教GDI+ 能不能做成类?<BR><br />我尝试一个简单的处理。<BR><br /><BR><br />testgg:TGPGraphics;testpath:TGPGraphicsPath;<BR><br /><BR><br /><BR><br />procedure TBaseGDI.test2;<BR><br />var a:Integer;pp:array of TGPPoint;<BR><br />begin<BR><br />{ SetLength(pp,3);<BR><br /> for a:=Low(pp) to High(pp) do pp[a]:=MakePoint(Random(600),Random(400));<br /> testpath.AddCurve(PGPPoint(@pp),3);}<BR><br /> ShowStatus(testpath.Reset);<BR><br />end;<BR><br /><BR><br />procedure TBaseGDI.test3;<BR><br />var pen:TGPPen;<BR><br />begin<BR><br />// testpath.Reset;<BR><br /> testpath.SetFillMode(FillModeAlternate);<BR><br /> testpath.AddLine(10,10,100,100);<BR><br /> testpath.AddLine(100,100,200,200);<BR><br /> testpath.AddLine(200,200,200,400);<BR><br /> pen:=TGPPen.Create($11FF0000,10);<BR><br /><BR><br /><BR><br /> ShowStatus(testgg.DrawPath(pen,testpath));//xxoo<BR><br /><BR><br />// testgg.DrawLine(pen,10,10,100,100);<BR><br /> pen.Free;<BR><br />end;<BR><br /><BR><br />procedure TBaseGDI.testBegin(ACanvas: TCanvas);<BR><br />begin<BR><br /> testgg:=TGPGraphics.Create(ACanvas.Handle);<BR><br /> testpath:=TGPGraphicsPath.Create;<BR><br />end;<BR><br /><BR><br />procedure TBaseGDI.testEnd;<BR><br />begin<BR><br /> testpath.Free;<BR><br /> testgg.Free;<BR><br />end;<BR><br /><BR><br />很不幸,在xxoo处显示 "GenericError"<BR><br />难道非要在同一个TEventNotify里才能正确的吗?<BR><br /><BR><br />iamduoduo@hotmail.com
-
严卫强
2008-07-14
-
发博,以及各位发博的好友们:<br /><br />请教GDI+ 能不能做成类?<br />我尝试一个简单的处理。<br /><br />testgg:TGPGraphics;testpath:TGPGraphicsPath;<br /><br /><br />procedure TBaseGDI.test2;<br />var a:Integer;pp:array of TGPPoint;<br />begin<br />{ SetLength(pp,3);<br /> for a:=Low(pp) to High(pp) do pp[a]:=MakePoint(Random(600),Random(400));<br /> testpath.AddCurve(PGPPoint(@pp),3);}<br /> ShowStatus(testpath.Reset);<br />end;<br /><br />procedure TBaseGDI.test3;<br />var pen:TGPPen;<br />begin<br />// testpath.Reset;<br /> testpath.SetFillMode(FillModeAlternate);<br /> testpath.AddLine(10,10,100,100);<br /> testpath.AddLine(100,100,200,200);<br /> testpath.AddLine(200,200,200,400);<br /> pen:=TGPPen.Create($11FF0000,10);<br /><br /><br /> ShowStatus(testgg.DrawPath(pen,testpath));//xxoo<br /><br />// testgg.DrawLine(pen,10,10,100,100);<br /> pen.Free;<br />end;<br /><br />procedure TBaseGDI.testBegin(ACanvas: TCanvas);<br />begin<br /> testgg:=TGPGraphics.Create(ACanvas.Handle);<br /> testpath:=TGPGraphicsPath.Create;<br />end;<br /><br />procedure TBaseGDI.testEnd;<br />begin<br /> testpath.Free;<br /> testgg.Free;<br />end;<br /><br />很不幸,在xxoo处显示 "GenericError"<br />难道非要在同一个TEventNotify里才能正确的吗?<br /><br />iamduoduo@hotmail.com
-
饭桶超人
2008-06-17
-
我已经搞定这个问题了,谢谢
-
饭桶超人
2008-06-13
-
毛兄,请教一个问题:用GDI+画带ALPHA的ICON时,ALPHA区域全部丢失了,请问你有什么好的办法吗
-
tplink2008
2008-06-08
-
我们是老乡,我是沙市区的。<br />请问毛老师.怎样才能让delphi 实现文字描边? <br />现在找到的就两个方法: <br />1.将文字上,下,左,右,左上,右上,左下,右下各位移一个像素形成描边, <br />但是如果位移一旦大于两个像素,就会形成"米"字形. <br />2.扫描每一个像素,发现与字体相同的颜色.然后再扫描这个像素四周,如果有背景色<br /><br />就进行填充.但是这种效率非常的慢. <br />因为我写的这个程序要生成几千张图片,所以这个效率肯定是不行的. <br />有没什么好方法?要用到GDI+吗?<br />我的QQ:7066431<br />email: tplink@126.com
-
耿
2008-06-06
-
好啊
-
真实
2008-06-01
-
你好,以前曾向您请教过一个问题,地址是<br/>http://topic.csdn.net/u/20070807/20/cd8dd5a4-270d-4931-ba5d-a9169ac2b136.html<br/>现在还是这个问题,再次向您请教<br/>问题是:如何得到这个数组中最大和最小的前两个值,并分别放到4个edit中
-
阿发伯
回复于
2008-06-03
-
因为是对象数组,不可能很大,可建立一个临时数组,用插入排序法将原数组排序到临时数组,取头和尾对象的值各2个即可。