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

如何在水晶报表中动态显示任意格式的图片  
  
 
前段时间,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);
            }
        }
其实这个实现非常简单,思路也容量想到。只是,还是希望能够给大家提供一些帮助或启迪了。

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

  1. 在水晶报表中实现任意选择指定字段显示-模板及C#升级版

    前文<在水晶报表中实现任意选择指定字段显示>中有朋友留言说是有无C#版本,最近有时间,重写了一下. 一是使用了VS2005 C#2.0 + Crystal Report 2008,另外就是 ...

  2. 解决水晶报表中动态加载的图片或利用水晶报表创建的图表不显示图片的方法

    开发水晶报表时在利用其创建图表时在IIS服务器图片不显示,解决方法如下: 在解决方案资源管理器->web项目-->右键 属性页,把多余的 引用 移除就可以了(注意版本),例如VS2005版 ...

  3. 水晶报表中动态显示图片

    1.在原有xsd的架构上增加一列imgdata,数据类型为Base64Binary; 2.生成项目,重新指定报表数据源,将imgdata字段放入报表的相应位置; 3.代码中,生成数据集时,查询语句在原 ...

  4. 水晶报表中如何创建自定义的纸张大小格式?

    问题 水晶报表中使用一个自定义的纸张类型格式(使用预先定义的纸张格式显示或者打印一个报表)? 解决方法 要创建一个自定义的纸张格式,来完成你工作中所使用的特殊纸张.在你开始工作之前,你必须确认你的打印 ...

  5. 利用数据集在水晶报表中显示图像

    描述 该 C# .NET Windows 程序演示了如何创建数据集,并将图像添加到数据集,以及在运行时将数据集传递到子报表. 文件列表 - bin\Debug\Canada.jpg - bin\Deb ...

  6. 水晶报表中对某一栏位值进行处理_终于有人讲清楚了,BI和报表的差异!

    IT系统自带报表功能,为什么还要额外采购BI? 报表和BI都能做数据分析,区别在哪里? 加班加点做了那么多表,为什么还不满足老板需求? 报表分析需要IT团队来开发,那BI呢? 这些应该是大家对商业智能 ...

  7. 利用数据集在水晶报表中显示图像的 .NET 程序教程

    目录 描述 文件列表 步骤 Form1.cs VB.NET 版 描述 该 C# .NET Windows 程序演示了如何创建数据集,并将图像添加到数据集,以及在运行时将数据集传递到子报表. 文件列表 ...

  8. winform水晶报表中添加图片

    文章目录 前言 一.VS中找不到ReportView 二.使用步骤 1.直接拉取控件到窗体 ​编辑 2.添加参数 总结 前言 应用场景:在做一个巡检机器人项目时,对于巡检结果,需要在Winform端显 ...

  9. 水晶报表中让行高自适应高度(即根据内容的来适应高度)

    1.在水晶报表打印中,有些内容可能占两行.三行.四行内容,但有些内容仅占一行内容,如果固定行高,会造成纸张的很大的浪费,如下图所示 2.如上图所示,零件型号.名称.规格三列超出一行内容,怎么让内容自适 ...

最新文章

  1. 推荐一款 Nginx 可视化配置神器
  2. distance from ifm to Sidney Sussex College: acceptable
  3. Exchange企业实战技巧(15)启用向外部联系人发送邮件时的提醒
  4. 统计学习方法 pdf_机器学习基础教材-《统计学习与数据分析介绍》免费pdf分享...
  5. YbtOJ#20240-[冲刺NOIP2020模拟赛Day10]弱者对决【笛卡尔树,区间dp】
  6. 数据结构单链表SingleLinkedList,Java实现单链表增删改查
  7. getDate()返回日期不一致问题引发的bug
  8. 苹果高通虽已和解 但5G iPhone最快仍要明年才能推出
  9. LeetCode 61. 旋转链表(python、c++)
  10. adb shell 查找并删除文件
  11. LWUIT的绘图功能
  12. 避重就轻:Intel的垄断抗辩
  13. arduino atmega328P MCP4725 proteus 仿真 程序
  14. win10系统安装Docker详解
  15. 第21章,DNS服务
  16. Oracle创建存储过程时出现“警告: 创建的过程带有编译错误。”
  17. 绘一幅人人出彩的教育画卷
  18. Pytorch实战 |Y5 yolo.py文件解读
  19. error C2065: ‘salary‘ : undeclared identifier
  20. 大数据发展必备三个条件

热门文章

  1. TensorflowSimilarity学习笔记2
  2. python查看电脑当前用户_PHP如何获取当前windows系统的登录用户名
  3. [渗透测试]Vulnstack 红队(三)
  4. linux红帽5安装,RedHat Linux 5安装手册
  5. 怎么在本地运行umi框架的生产模式
  6. 内连接,左右连接的区别
  7. 英语六级作文常用谚语
  8. Linux的scp 命令使用方法
  9. “睡你妹闹钟”——你还真是让人又爱又恨啊
  10. Google 出王炸!Meet 免费支持 100 人同时在线,与 Zoom 正面刚