ImageMagick: DrawImage(Image*,DrawInfo*) 绘制填充图片时卡住的原因分析

今天傍晚在测试的时候无意发现有两个动画会卡住,正常情况下,20秒就完成的操作,突然卡住。

CPU:95%+,经过30 - 50秒左右后,程序又能正常的向下执行,结果是对的。

这种情况不是每次都发生,有的时候执行20次,会出现 1 - 2次卡住,但没有完全卡死。

经过在多段代码之间加多个printf()来打印执行的位置,发现卡住的代码是:DrawImage(mw_frame->images, draw_info);

下面是相关代码:

经过测试发现每次卡住的时候,都是在 i == 0的时候,通过分析发现,如果 i == 0,那么绘制的四边框将不存在。

因为四边框的宽与高都为 0, 可能就是因为这个原因导致 DrawImage() 卡住。

我将原来的 for(i=0;i<...) 改为 for(i=1;i<) 后,经过多次测试发现不会再卡住了。

DrawingWand *d_wand = NewDrawingWand(); //

//从四周不断的画四边形

DrawRectangle(d_wand, 0, 0, step * i, step * i); //左上角

DrawRectangle(d_wand, 0, height, step * i, height - step * i); //左下角

DrawRectangle(d_wand, width, 0, width - step * i, step * i); //右上角

DrawRectangle(d_wand, width , height, width - step * i, height - step * i); //右下角

// Now "peek" at the wand

DrawInfo *draw_info = PeekDrawingWand(d_wand); //返回当前图形的魔杖信息。

draw_info->fill_pattern = mw->images; //设置填充图片

if(mw_frame == NULL)

{

//如果 mw_pre 不为空, 就使用上一个 mw_pre, 反之就新建一个新画布

mw_frame = mw_pre ? mw_pre : imgNewCanvas(width, height, "#000000");

}

DrawImage(mw_frame->images, draw_info); //绘制图片, 在这里有的时候会卡住,频率在: 10%左右

2014-09-14

时间: 2024-10-12 22:04:28

ImageMagick: DrawImage(Image*,DrawInfo*) 绘制填充图片时卡住的原因分析的相关文章

使用MFC CImage类绘制PNG图片时遇到的问题

原文链接: http://blog.csdn.net/chenlycly/article/details/9193143 为了测试CImage绘制PNG图片的效果,我们用截图软件截得一张360的界面,然后使用PhotoShop等工具在图片的周边加上了透明的区域,然后保存成PNG图片文件.CImage首先从文件中加载,即 CImage* m_pImgBk; ...... m_pImgBk = new CImage; m_pImgBk->Load( _T("res\\bk.png")

Flex 绘制圆形并填充图片

注意:Ellipse 绘制椭圆,当width = height 时 则绘制圆形. BitmapFill:填充图片 <s:Group id="gpimgUser" width="25" height="25" click="clickHandler(gpimgUser)"> <s:Ellipse id="ellipse" top="0" right="0&quo

C# 使用Graphics绘制图片时发生闪烁的问题

在做某功能时,需要实现用鼠标滚轮放大缩小图片,直接在MouseWheel中绘制图片时发生闪烁 百度后顺利解决 几个步骤 1.设置Form的DoubleBuffered属性为True 2.在MouseWheel中调用 this.Invalidate()方法(会触发OnPaint事件) 3.重写OnPaint,在OnPaint中绘制需要绘制的图像 代码如下: public partial class Form1 : Form { int width, height; string path = "C

Libgdx 循环绘制图片时间隔的问题

在libgdx中使用循环绘制一张图片铺满某个区域时,有可能会遇到像素计算没有问题时,图块中间还是有约1像素的间隔,或者是本来没有间隔,做了缩放处理之后发现中间有间隔. 解法 当使用Texture加载图片时: Texture myTexture = new Texture( Gdx.files.internal("texture.png") ); myTexture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilte

使用MFC CImage类和GDI+ Image加载并绘制PNG图片

一.使用MFC CImage类加载PNG图片        为了测试CImage绘制PNG图片的效果,我们用截图软件截得一张360的界面,然后使用PhotoShop等工具在图片的周边加上了透明的区域,然后保存成PNG图片文件.CImage首先从文件中加载,即 CImage* m_pImgBk; ...... m_pImgBk = new CImage; m_pImgBk->Load( _T("res\\bk.png")); if ( m_pImgBk->IsNull() )

GDI+ 填充背景时,非常多时候不起作用,GDI、GDI+配合运用

在ONDRAW中运行GDI+ 填充背景时,不起作用,不知道什么原因 [cpp] view plaincopy Graphics graphics(pDC->GetSafeHdc()); Bitmap bmp(m_imgRec.Width(),m_imgRec.Height()); //第一步 创建与屏幕等大小的内存位图 Graphics grbmp(&bmp); SolidBrush backBrush(RGB(255,255,255)); grbmp.FillRectangle(&

cropper图片编辑插件绘制圆形图片

实现 在上传图片前需要对图片进行编辑,我选用的是cropperjs插件 绘制圆图的主要思路首先是将图片选取框中的可见区域设置为圆形,再在上传图片时在原图的基础上通过JS选取出一个圆图,再将选取的圆图上传到后台接口 通过CSS设置cropper选取框的样式为圆形 .cropper-view-box, .cropper-face { border-radius: 50%; } 通过canvas在原图的基础上选取一个圆图 function getRoundedCanvas(){ var crop=(.

C#如何消除绘制图形缩放时抖动,总结

一.手动双缓冲 首先定义一个BitmapBitmap backBuffer = new Bitmap(画布宽度, 画布高度);然后获取这个Bitmap的GraphicsGraphics graphics = Graphics.FromImage(backBuffer);然后在这个graphics上进行绘图graphics.Clean(Color.Black); 当所有绘图完成之后,将这个Bitmap再绘制到窗口的画布上,注意不要清理窗口的画布:windowGraphics.DrawImage(b

绘制九宫格图片

package *; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.L