在水晶报表中动态显示任意格式的图片

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 
在水晶报表中动态显示任意格式的图片
 
 
 

如何在水晶报表中动态显示任意格式的图片  
  
 
前段时间,Accounting 项目内需要在水晶报表中动态显示任意格式的图片。但是,水晶报表只支持OleDb的静态加载图片和动态在 IFieldObject中显示图片,显然,静态加载是不行的了,而后者仅支持JPEG和BMP格式的图片。因此,我们需要把任意格式的图片预先转换成受支持的JEPG或BMP格式,再填充到DataSet中,然后动态地推入到水晶报表中。

      下面的示例中将讲述如何将一个给定路径或从其它途径得到的一个图片流转换成JPEG格式并返回成一个字节数组,以提供给后续应用:


using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace Common
{
    /**//// <summary>
    /// 与图像相关的工具类。
    /// </summary>
    public class ImageUtil
    {
        public ImageUtil()
        {
        }

        /**//// <summary>
        /// 从指定路径中读取一个图像文件并保存到字节数组中。
        /// 此方法供水晶报表显示图片使用,所返回字节数组是 BMP 或 JEPG 格式图像数据的数组。
        /// </summary>
        /// <param name="path">指定的文件路径</param>
        /// <returns>从图像中读取出的数据。</returns>
        public static byte[] ReadImage(string path)
        {
            FileStream stream = null;
            try
            {
                stream = File.OpenRead(path);
                return ReadImage(stream);
            }
            finally
            {
                if(stream != null)
                {
                    stream.Close();
                }
            }
        }

        /**//// <summary>
        /// 从给定的流中读取数据到一个字节数组中,并返回此数组。
        /// 如果给定的流不是一个图像格式的流,将报异常。
        /// 返回的字节数组中,将非BMP和JEPG格式的图像数据流转换为JEPG格式输出,以支持大多数应用。
        /// 适用于直接从数据库中读取的二进制图像流的处理。
        /// </summary>
        /// <param name="stream">给定的图像数据流。</param>
        /// <returns>从流中读取的数据。</returns>
        public static byte[] ReadImage(Stream stream)
        {
            Image image = Image.FromStream(stream);
            byte[] myImage = null;

            if(image.RawFormat.Guid != ImageFormat.Jpeg.Guid && image.RawFormat.Guid != ImageFormat.Bmp.Guid)
            {
                MemoryStream memStream = new MemoryStream();
                image.Save(memStream, ImageFormat.Jpeg);
                myImage = memStream.GetBuffer();
                memStream.Close();
            }
            else
            {
                stream.Position = 0;
                myImage = new byte[stream.Length];
                stream.Read(myImage, 0, (int)stream.Length);
            }
            return myImage;
        }
    }
}
下面是应用上面代码的一个示例(非完整):


 private void Form7_Load(object sender, System.EventArgs e)
         {
             string[] etc = new string[]{"jpg", "gif", "bmp", "tif", "png"};
             string path = @"C:/Documents and Settings/sh12/My Documents/My Pictures/NeweggLogo.";
             try
             {
                 byte[] myImage = null;
 
                 Dataset2 ds = new Dataset2();
                DataRow drNew = null;
                for(int i=0; i<etc.Length; i++)
                {
                    myImage = Newegg.Common.ImageUtil.ReadImage(path + etc);

                    drNew = ds.MyTable.NewRow();
                    drNew["ImageType"] = etc;
                    drNew["ImageData"] = myImage;
                    ds.MyTable.Rows.Add(drNew);
                }

                myImage = Newegg.Common.ImageUtil.ReadImage(@"C:/Documents and Settings/sh12/My Documents/My Pictures/untitled.JPG");
                drNew = ds.MyTable.NewRow();
                drNew["ImageType"] = "untitled.JPG";
                drNew["ImageData"] = myImage;
                ds.MyTable.Rows.Add(drNew);

                ds.AcceptChanges();

                CrystalReport1 rpt = new CrystalReport1();
                rpt.SetDataSource(ds);
                this.crystalReportViewer1.ReportSource = rpt;
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
其实这个实现非常简单,思路也容量想到。只是,还是希望能够给大家提供一些帮助或启迪了。

在水晶报表中动态显示任意格式的图片
 
如何在水晶报表中动态显示任意格式的图片  
  
 
前段时间,Accounting 项目内需要在水晶报表中动态显示任意格式的图片。但是,水晶报表只支持OleDb的静态加载图片和动态在 IFieldObject中显示图片,显然,静态加载是不行的了,而后者仅支持JPEG和BMP格式的图片。因此,我们需要把任意格式的图片预先转换成受支持的JEPG或BMP格式,再填充到DataSet中,然后动态地推入到水晶报表中。

      下面的示例中将讲述如何将一个给定路径或从其它途径得到的一个图片流转换成JPEG格式并返回成一个字节数组,以提供给后续应用:


using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace Common
{
    /**//// <summary>
    /// 与图像相关的工具类。
    /// </summary>
    public class ImageUtil
    {
        public ImageUtil()
        {
        }

        /**//// <summary>
        /// 从指定路径中读取一个图像文件并保存到字节数组中。
        /// 此方法供水晶报表显示图片使用,所返回字节数组是 BMP 或 JEPG 格式图像数据的数组。
        /// </summary>
        /// <param name="path">指定的文件路径</param>
        /// <returns>从图像中读取出的数据。</returns>
        public static byte[] ReadImage(string path)
        {
            FileStream stream = null;
            try
            {
                stream = File.OpenRead(path);
                return ReadImage(stream);
            }
            finally
            {
                if(stream != null)
                {
                    stream.Close();
                }
            }
        }

        /**//// <summary>
        /// 从给定的流中读取数据到一个字节数组中,并返回此数组。
        /// 如果给定的流不是一个图像格式的流,将报异常。
        /// 返回的字节数组中,将非BMP和JEPG格式的图像数据流转换为JEPG格式输出,以支持大多数应用。
        /// 适用于直接从数据库中读取的二进制图像流的处理。
        /// </summary>
        /// <param name="stream">给定的图像数据流。</param>
        /// <returns>从流中读取的数据。</returns>
        public static byte[] ReadImage(Stream stream)
        {
            Image image = Image.FromStream(stream);
            byte[] myImage = null;

            if(image.RawFormat.Guid != ImageFormat.Jpeg.Guid && image.RawFormat.Guid != ImageFormat.Bmp.Guid)
            {
                MemoryStream memStream = new MemoryStream();
                image.Save(memStream, ImageFormat.Jpeg);
                myImage = memStream.GetBuffer();
                memStream.Close();
            }
            else
            {
                stream.Position = 0;
                myImage = new byte[stream.Length];
                stream.Read(myImage, 0, (int)stream.Length);
            }
            return myImage;
        }
    }
}
下面是应用上面代码的一个示例(非完整):


 private void Form7_Load(object sender, System.EventArgs e)
         {
             string[] etc = new string[]{"jpg", "gif", "bmp", "tif", "png"};
             string path = @"C:/Documents and Settings/sh12/My Documents/My Pictures/NeweggLogo.";
             try
             {
                 byte[] myImage = null;
 
                 Dataset2 ds = new Dataset2();
                DataRow drNew = null;
                for(int i=0; i<etc.Length; i++)
                {
                    myImage = Newegg.Common.ImageUtil.ReadImage(path + etc);

                    drNew = ds.MyTable.NewRow();
                    drNew["ImageType"] = etc;
                    drNew["ImageData"] = myImage;
                    ds.MyTable.Rows.Add(drNew);
                }

                myImage = Newegg.Common.ImageUtil.ReadImage(@"C:/Documents and Settings/sh12/My Documents/My Pictures/untitled.JPG");
                drNew = ds.MyTable.NewRow();
                drNew["ImageType"] = "untitled.JPG";
                drNew["ImageData"] = myImage;
                ds.MyTable.Rows.Add(drNew);

                ds.AcceptChanges();

                CrystalReport1 rpt = new CrystalReport1();
                rpt.SetDataSource(ds);
                this.crystalReportViewer1.ReportSource = rpt;
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
其实这个实现非常简单,思路也容量想到。只是,还是希望能够给大家提供一些帮助或启迪了。

水晶报表中动态加载图片的实现方法与实战技巧 在现代商业智能与报表系统中,图像信息的可视化呈现已成为提升数据表达力的重要手段。水晶报表(Crystal Reports)作为一款成熟的报表开发工具,支持将图片以动态方式嵌入报表中,实现基于数据变化的图像展示。本章深入探讨动态图片显示的核心价值,涵盖产品目录、员工档案、订单状态等典型应用场景,剖析静态插入与动态绑定的本质差异。graph TDA[图像来源] --> B[数据库二进制字段]A --> C[外部URL路径]B --> D[OLE对象或Image类型] 阅读详情

相关推荐

水晶报表制作实战指南:从设计到部署

在设计界面中,除了上述用于放置报表不同部分的区域外,还有一系列的工具箱,它们提供不同的功能用于设计报表:工具箱(Toolbox):列出了可以添加到报表中的各种控件,包括文本框、图像框、图表等。字段资源管理器(Field Explorer):在此区域可以查看和管理报表所使用到的数据字段,可以添加或删除字段。格式化工具栏(Formatting Toolbar):用于快速访问文本、背景和边框的格式化选项。布局工具栏(Layout Toolbar):包含布局调整和对齐的选项。

weixin_29025501的博客 1417

水晶报表-动态加载图片

实现将图片动态加载到水晶报表中,解决水晶报表添加图片的问题。

水晶报表动态显示图片

水晶报表动态显示图片水晶报表动态显示图片水晶报表动态显示图片水晶报表动态显示图片水晶报表动态显示图片水晶报表动态显示图片

Crystal Reports(水晶报表)支持图片格式

Crystal   Reports  reads   the   following  SQL   BLOB   formats:  ·   TIFF ·   BMP ·   JPEG ·   PNG  Crystal   Reports  does   not   support:  ·   GIF   ·   TIFF   files  that   use

SAP 1231

水晶报表图片篇-a】 动态加载图片图片文件版本及数据库版本)

开发环境: VS2003(VB.Net) + 水晶报表10高级专业开发版 + Win2003 Step1:数据库文件版本 如果你在数据库中采用了二进制字段存储图片文件 微软 Access 里这些字段叫作 OLE 字段,而Oracle和SQL Server把它们称作 BLOB (二进制大型对象) 字段 那么在报表上显示出来就非常之简单 因为之前我没有做过类似的显示...

weixin_30772105的博客 145

为你的水晶报表装载本地图片

本文为解答该贴所做:http://topic.csdn.net/u/20090524/15/911fd15a-32c6-4be9-9aa1-3ee95365e7e3.html  并没有什么新内容,主要是如何读取本地图片显示在报表中。 如果是CR XI及以上版本,可以用更简便的方法,参考:水晶报表图片动态加载的另一种简单方案 本文的方法是:水晶报表中如何动态加载图片图片文件版本及数据库版本...

weixin_34179762的博客 434

水晶报表CrystalReport实现报表打印和动态图片导入

在新弹窗中,选择"报表字段",在字段列表中找到封装了动态URL的字段,双击后,会自动带出到下方的输入框中,选择"保存并关闭"SAP网站是国外网站,是全英文的,网站资源很丰富,找个CrytalReport都费劲。或者可通过网盘下载链接下载相关jar依赖,直接放到maven仓库下的\com目录下解压。设计好报表的样式,把数据源的字段拖曳过来即可,这里主要详细介绍一下动态图片的配置。我用的水晶报表设计器是2008版本,有需要的可通过以下链接下载破解版。下载后傻瓜式的安装就可以了,破解安装后,打开的界面如下。

wusy001的博客 2663

如何在水晶报表动态显示任意格式图片

前段时间,Accounting 项目内需要在水晶报表动态显示任意格式图片。但是,水晶报表只支持OleDb的静态加载图片和动态在 IFieldObject中显示图片,显然,静态加载是不行的了,而后者仅支持JPEG和BMP格式图片。因此,我们需要把任意格式图片预先转换成受支持的JEPG或BMP格式,再填充到DataSet中,然后动态地推入到水晶报表中。 下...

weixin_30248399的博客 290

如何在VC++下动态调整水晶报表图片的大小

        我用的是VS2005中的内嵌水晶报表,在采用拉模式下,我们可以将数据库中的大字段(Access是ole,Oracle是blob,SQL Server是image)直接拉至水晶报表相应位置并显示出来。但是这种方法有一个很严重的缺陷,那就是预设大小是无法改变的。在对象格式中,“图片大小”选项卡中图片宽、高是没有公式可以编辑的,这样如果数据库中保存的图片和预设大小不相同,就产生变形,为了

青蛙王子的专栏 4434

C#在水晶报表中加载ArcEngine地图

 在水晶报表中加载ArcEngine地图         众所周知        水晶报表中动态更新        只能通过与数据库的连接实现         于是得出        若要将地图窗口的视图动态打印出来        可以通过以下这种思路:        1.构建数据表,最好是在本地,避免网络耗时;在其中添加blob字段。        2.程

yanleigis的专栏 2168

水晶报表中插入图片,已验证成功,就一个简单的方法。

水晶报表中插入图片,只提供方法,水晶报表,无非就是在Microsoft Visual Studio 2005/08/10等里面拖拉控件。 水晶报表两个插件:CrystalReportViewer、ReportDocument

水晶报表图片篇-c】 CR 11版本动态加载的另一种简单方案

2005年我在《水晶报表中如何动态加载图片图片文件版本及数据库版本)》 提供的方法中,用了编程的方法,虽然也实现了,但是比较繁琐 地址: http://www.cnblogs.com/babyt/archive/2005/04/21/142789.html 对于数据库中仅保存图片路径的情况,主要是用了根据路径读取图片stream的方法 今天一个无意中的发现了另外一种简便的

findsafety的专栏 4405

水晶报表中如何动态加载图片图片文件版本及数据库版本)

开发环境: VS2003(VB.Net) + 水晶报表10高级专业开发版 + Win2003 Step1:数据库文件版本 如果你在数据库中采用了二进制字段存储图片文件 微软 Access 里这些字段叫作 OLE 字段,而Oracle和SQL Server把它们称作 BLOB (二进制大型对象) 字段 那么在报表上显示出来就非常之简单 因为之前我没有做过类似的显示图片文件的报表,等我做出来之...

weixin_30711917的博客 192

Crystal Report動態顯示圖片

引子 水晶報表以其強大的功能占距了強大的開發市場,其列印出的報表美觀、大方,深得用戶喜愛,然而其某些功能上不免有些瑕疵。例如,當資料庫中只存放了圖片的路徑時,當你在設計報表時,卻沒有提供將其列印成圖片的功能。當然,新版本XI R2是有提供這些功能的,然,你總不會因為這個功能就要求你老闆去買最新版的CrystalReport吧? 既然選擇了程式員這一行業,我想沒有最新的工具,我們也能做出漂亮的...

weixin_30888027的博客 350

水晶报表 动态控制图片显示 Changing pictures dynamically in Crystal Report

项目需要在报表中根据条件动态显示不同的签名 查找了好多解决方案,一个比较简单的方案: http://www.cnblogs.com/kingjiong/archive/2009/01/07/1370874.html 本人试验是可以用的,但是正如作者所讲,基于CR XI 独立版本实现。CR9和CR10都无此功能。 就是说,用独立CR XI 完整版本做,可以实现效果,但是一旦在VS2...

weixin_30412577的博客 184

[转]水晶报表中动态保留数字字段小数位 [http://blog.csdn.net/xwdd129/archive/2006/05/29/760661.aspx]

默认的数字字段会带有2或3位小数位,而当字段小数部分为零时,小数位将变成2或3个”0”(如123.00),很多时候我们不想要这几个多余的0,需要字段在有小数时显示小数位,没有小数时自动去掉多余的0。这个问题,我很久以前帮网友回答过,但现在仍经常看到网友问这个问题,索性写篇文章,以供大家参考: 1, 看下面的图片,分组小计字段中,数据默认保留两位小数点。2, 我现在想让3M字段的

gxj022的专栏 981
下一篇: 绞车提升能力及钢丝绳验算软件验算结果如下
yagi85
博客等级 码龄19年 4粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值