文档章节

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

通吃岛-低手哥
 通吃岛-低手哥
发布于 2016/08/05 11:37
字数 464
阅读 110
收藏 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;

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

© 著作权归作者所有

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

通吃岛-低手哥

粉丝 16
博文 41
码字总数 9808
作品 0
广州
程序员
图像处理库的比较:OpenCV,FreeImage,CImg,CxImage

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

moki_oschina
2015/01/15
0
0
向Richedit插入动态Gif的实现(关于QQ表情功能的制作)

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

IMGTN
2012/12/06
0
0
基于OpenCV的iOS图像处理

关于图片处理 随着科技的发展,AI、机器学习、AR、VR等已经逐渐走进生活,模式识别、图像捕捉、图片拼接等已经成为其中的重要环节。因此,图像处理技术在未来会被移动端广泛使用。其中,有很...

无忌不悔
2017/09/06
0
0
windows下的富文本框--PMEdit

一、在开始之前首先吐槽一下,本人是一个独立开发者,在中国独立开发者就代表一个比较苦逼的行业,特别是对底层东西进行开发者,尤其本人研究方向是编译器、解析器基本上没有公司要,所以出来...

feirench
2013/04/05
6.1K
2
工作小结

1,Win2000下动态加载DLL时遇到一个奇怪的问题, 复制代码 CString sdkPath = _T("C:\WINDOWS\system32"); ::SetCurrentDirectory(sdkPath); handle = ::LoadLibrary(_T("C:\WINDOWS\system32\......

嗯哼9925
2017/12/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
32分钟前
0
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部