文档章节

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

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

配置Spring的注解支持

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 配置Spring的注解支持 以上也提到了使用注解来配...

凯哥学堂
34分钟前
0
0
关于Spring Aop存在的一点问题的思考

在本人前面的文章Spring Aop原理之切点表达式解析中讲解了Spring是如何解析切点表达式的,在分析源码的时候,出现了如下将要讲述的问题,我认为是不合理的,后来本人单纯使用aspectj进行试验...

爱宝贝丶
36分钟前
0
0
JavaScript 概述

JavaScript是面向Web的编程语言。绝大多数现代网站都使用了JavaScript,并且所有的现代Web浏览器——基于桌面系统、游戏机、平板电脑和智能手机的浏览器——均包含了JavaScript解释器。这使得...

Mr_ET
今天
0
0
Java Run-Time Data Areas(Java运行时数据区/内存分配)

Java运行时数据区(内存分配) 本文转载官网 更多相关内容可查看官网 中文翻译可参考 2.5. Run-Time Data Areas The Java Virtual Machine defines various run-time data areas that are use...

lichuangnk
今天
0
0
docker learn :services docker-compose.yml

docker-compose.yml定义了服务的运行参数 version: "3" services: web: # replace username/repo:tag with your name and image details image: hub.c.163.com/dog948453219/friendlyhello d......

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部