文档章节

修改一下DELPHI ,cxImage控件显示图片异常时候的情况

通吃岛-低手哥
 通吃岛-低手哥
发布于 2016/08/05 11:37
字数 464
阅读 144
收藏 0

客户提出客户端预览图片的时候经常报错,影响操作。经检查是图片异常导致cxImage控件不停的显示异常导致的。
我个人为了省事,直接修改 DevExpress\Library\ExpressEditors5\cxImage.pas 文件

定位到1462行这个函数:procedure TcxImageViewInfo.InternalPaint(ACanvas: TcxCanvas);

增加try except end,省事。。。

 try
    with ACanvas do
    begin
      if not Assigned(Picture) or IsPictureEmpty(Picture) then
      begin
        inherited InternalPaint(ACanvas);
        Brush.Color := BackgroundColor;
        if Caption <> '' then
        begin
          Brush.Style := bsClear;
          Canvas.Font.Assign(Self.Font);
          Canvas.Font.Color := Self.TextColor;
          ACanvas.DrawText(Caption, CR, cxAlignCenter + cxSingleLine);
          Brush.Style := bsSolid;
        end;
        if ShowFocusRect then FocusRect(Canvas, CR);
        Exit;
      end;
      with CR do
      begin
        if Stretch then
        begin
          CalcStretchRect(CR, Picture.Width, Picture.Height, R);
          if Center then
          begin
            OffsetRect(R, (Right - Left - (R.Right - R.Left)) div 2, 0);
            OffsetRect(R, 0, (Bottom - Top - (R.Bottom - R.Top)) div 2);
          end;
        end
        else
        begin
          R := Rect(Left, Top, Left + Picture.Width, Top + Picture.Height);
          if Center then
          begin
            OffsetRect(R, (Right - Left - Picture.Width) div 2, 0);
            OffsetRect(R, 0, (Bottom - Top - Picture.Height) div 2);
          end
          else
            OffsetRect(R, -Self.TopLeft.X, -Self.TopLeft.Y);
        end;
      end;
      SaveRgn := GetClipRegion; // for native mode
      ExcludeClipRect(CR);
      DrawCustomEdit(ACanvas, Self, False, bpsSolid);
      SetClipRegion(SaveRgn, roSet);
      if ShowFocusRect then
      begin
        FocusRect(Canvas, CR);
        InflateRect(CR, -1, -1);
      end;
      SaveRgn := GetClipRegion;
      IntersectClipRect(CR);
      if ShowFocusRect then InflateRect(CR, 1, 1);
      if not Self.Transparent and Picture.Graphic.Transparent then
      begin
        if FTempBitmap = nil then
        begin
          FTempBitmap := TBitmap.Create;
          FTempBitmap.PixelFormat := pfDevice;
        end;
        try
          FTempBitmap.Width := R.Right - R.Left;
          FTempBitmap.Height := R.Bottom - R.Top;
          FTempBitmap.Canvas.Brush.Color := BackgroundColor;
          FTempBitmap.Canvas.FillRect(Rect(0, 0, FTempBitmap.Width, FTempBitmap.Height));
          FTempBitmap.Canvas.StretchDraw(Rect(0, 0, FTempBitmap.Width, FTempBitmap.Height), Picture.Graphic);
          Canvas.Draw(R.Left, R.Top, FTempBitmap);
        except
          on EOutOfResources do
          begin
            Canvas.Brush.Color := BackgroundColor;
            Canvas.FillRect(ClientRect);
            Canvas.StretchDraw(R, Picture.Graphic);
          end;
        end;
      end
      else
        Canvas.StretchDraw(R, Picture.Graphic);
      NeedDrawBkg := not (IntersectRect(Temp, R, CR) and EqualRect(Temp, CR)) and not Self.Transparent;
      if NeedDrawBkg then
      begin
        ExcludeClipRect(R);
        Brush.Color := BackgroundColor;
        FillRect(CR);
      end;
      SetClipRegion(SaveRgn, roSet);
    end;
  except
    ACanvas.Brush.Color := clWhite;
    ACanvas.Canvas.FillRect(ClientRect);
    ACanvas.DrawTexT('无法查看此图片,因为此文件可能已损坏、损毁或者过大', ClientRect,   DT_VCENTER or DT_CENTER);
  end;


try
....................
  except
    ACanvas.Brush.Color := clWhite;
    ACanvas.Canvas.FillRect(ClientRect);
    ACanvas.DrawTexT('无法查看此图片,因为此文件可能已损坏、损毁或者过大', ClientRect,   DT_VCENTER or DT_CENTER);
  end;

此处是我新增部分,其余是原有的,你们还有什么好的处理方式吗?

© 著作权归作者所有

共有 人打赏支持
通吃岛-低手哥

通吃岛-低手哥

粉丝 17
博文 41
码字总数 9808
作品 0
广州
程序员
私信 提问
图像编程的好帮手-四大图像库:OpenCV/FreeImage/CImg/CxImage

图像编程的好帮手-四大图像库:OpenCV/FreeImage/CImg/CxImage 2009-01-09 20:22 1.对OpenCV 的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册...

晨曦之光
2012/05/28
687
0
图像处理库的比较:OpenCV,FreeImage,CImg,CxImage

1.对OpenCV 的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法; 然后将图像格式和...

moki_oschina
2015/01/15
0
0
freeimage和cximage二次开发

最近正在进行数字摄影测量,需要进行图像、图形处理,比如三维转化为二维的图形处理等。要进行二次开发一个图形转换系统,大家觉得freeimage和cximage哪个更加适合二次开发的? 我是一名新手...

天涯明月
2013/03/04
1K
2
C++软件开发第三方库大全

1.boost 这个使用的人多不多说了 2.pthread windows下的posix线程实现 3.libcurl 一个有名的开源网络爬虫库 阿里旺旺中使用到了 4.libeay32 OpenSSL Library 5.libtidy 一个专门解析htm的库 ...

晨曦之光
2012/04/13
1K
0
向Richedit插入动态Gif的实现(关于QQ表情功能的制作)

向Richedit插入动态Gif的实现(关于QQ表情功能的制作) 要做一个类似QQ表情的东西,用BCB6.0来做,本来这个工具也不是熟悉,用得多还是VC吧,难! 上网查了一下,因为要播放GIF文件,那个在CSDN说的几...

IMGTN
2012/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TiDB 3.0 Beta Release Notes

2019 年 1 月 19 日,TiDB 发布 3.0 Beta 版,对应 master branch 的 TiDB-Ansible。相比 2.1 版本,该版本对系统稳定性、优化器、统计信息以及执行引擎做了很多改进。 TiDB 新特性 支持 Vi...

TiDB
26分钟前
2
0
从拼多多优惠券事件看到的一些反思

本文由云+社区发表 作者:颜国平 摘要:最近几年,电商行业飞速发展,各种创业公司犹如雨后春笋大量涌现,商家通过各种活动形式的补贴来获取用户、培养用户的消费习惯,即将到来的“ 购物狂欢...

腾讯云加社区
27分钟前
4
0
记录一次BUG

1: 请求注册页面时生成一个UUID, 并且将UUID隐藏在页面中并且添加到session中去。 2: 发送短信时获取手机号和UUID,将两者发送至服务器 3: 先判断UUID和session中UUID是否一致。 不一致就...

专业写BUG的程序员
32分钟前
1
0
阿里云漏洞提示:phpMyAdmin <=4.8.1 checkPageValidity函数缺陷可导致GETSHELL

如题: phpMyAdmin <=4.8.1 后台checkPageValidity函数缺陷可导致GETSHELL 即:checkPageValidity函数对外部输入过滤不严,可导致本地包含任意文件。进一步地攻击者可通过注入代码到特定文件...

408582708
32分钟前
1
0
PyTorch可视化理解卷积神经网络

摘要: 神经网络工具像一个黑匣子,无法知道它的中间是如何处理的。本文使用图片加代码的形式讲解CNN网络,并对每层的输出进行可视化,便于初学者理解,可以动手实践下哦! 如今,机器已经能...

阿里云官方博客
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部