水晶报表--能否以记录中的图片分组

tenkol 2010-10-26 12:01:29
如题,每笔记录中都含有图片,其中有很多记录的图片都一样,为了美观,也为了节省纸张,想以图片来给记录分组显示出来,但是水晶报表的分组设计中,似乎不能以图片格式的字段来分组的,有什么办法达成以图片来分组显示的效果呢?
...全文
145 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liguodong008 2011-07-07
  • 打赏
  • 举报
回复
请问像图片中那样每个分组中显示一张图片是怎么通过设置或代码实现的呢
阿泰 2010-10-26
  • 打赏
  • 举报
回复
图片没法作为分组字段,水晶报表还没智能到能判断出两个图片一模一样来,呵呵。
既然图片一样的话,表中的一些记录应该也一样才对,有没有另外匹配的字段(或几个字段的组合)?
tenkol 2010-10-26
  • 打赏
  • 举报
回复
哈,搞掂,谢谢。

阿泰 2010-10-26
  • 打赏
  • 举报
回复
貌似你这个没有做:

节专家,设置组页眉节,勾选“延伸到后续节”
tenkol 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 babyt 的回复:]
这样试试:
按某字段分组,把图片字段放到组页眉上,节专家中,设置组页眉节,可以“延伸到后续节”。
[/Quote]

嗯,我就是这么做的,效果如上图所示,不知道还能否做得更美观点。。。

[Quote=引用 8 楼 babyt 的回复:]
问个代码的问题,
这段是代码是读取一个高质量的图片,回写到记录集,
然后把记录集重新给水晶报表,不通过显示,直接用printtoprinter进行打印,对吗
[/Quote]

既可以显示在预览页上,也可以直接打印,都没问题的

[Quote=引用 8 楼 babyt 的回复:]
那这样的话,数据库中存储的图片(或者是读取自文件的图片),
在经过预览环节后,分辨率降低,导致打出后分辨率很低。
那么你通过这段代码得到的图片,跟之前给报表的图片不是一批图片对吧?
[/Quote]

根据打印出来的效果,感觉分辨率没什么区别,图片可以说是新图片了,因为是根据长宽比例重新绘制了一次,虽然内容都一样


阿泰 2010-10-26
  • 打赏
  • 举报
回复
这样试试:
按某字段分组,把图片字段放到组页眉上,节专家中,设置组页眉节,可以“延伸到后续节”。


问个代码的问题,
这段是代码是读取一个高质量的图片,回写到记录集,
然后把记录集重新给水晶报表,不通过显示,直接用printtoprinter进行打印,对吗

那这样的话,数据库中存储的图片(或者是读取自文件的图片),
在经过预览环节后,分辨率降低,导致打出后分辨率很低。

那么你通过这段代码得到的图片,跟之前给报表的图片不是一批图片对吧?



tenkol 2010-10-26
  • 打赏
  • 举报
回复
算是实现了基本效果,不知道还能否再美观点。。。

tenkol 2010-10-26
  • 打赏
  • 举报
回复
哈,不好意思,我自己都不知道怎么用上感叹号了,呵呵,没别的意思。

我所谓二次处理,就是在打印前,对数据集里的存储图片的字段值进行处理,即根据设定的打印图片框大小,来调整图片的长宽比例,不知道我这么说,能明白不。附上处理函数:



Imports System.IO

Public Function ResizeImage(ByVal sImage As Byte(), ByVal ImageSize As Integer) As Byte()
Dim ow, oh, nw, nh, nx, ny As Integer
Dim img As Image = Nothing
Dim newimg As Image = Nothing
Dim imgstream As MemoryStream = Nothing
Dim newimgstream As MemoryStream = Nothing
Try
If IsDBNull(sImage) Then
Return Nothing
End If
imgstream = New MemoryStream(sImage)
'获取原图片宽高
img = Image.FromStream(imgstream)
imgstream.Dispose()
ow = img.Width
oh = img.Height
'按比例设置新宽高
If ow > oh Then
nw = ImageSize
nh = CType(nw * oh / ow, Integer)
nx = 0
ny = CType((ImageSize - nh) / 2, Integer)
Else
nh = ImageSize
nw = CType(nh * ow / oh, Integer)
ny = 0
nx = CType((ImageSize - nw) / 2, Integer)
End If
'建立新图片
newimg = New Bitmap(ImageSize, ImageSize)
'建立新画板
Dim g As Graphics = Graphics.FromImage(newimg)
'高质量插入
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
'清空画布并以白色背景色填充
g.Clear(Drawing.Color.White)
'按新宽高比在新图片居中位置绘画原图片内容
g.DrawImage(img, nx, ny, nw, nh)
'将新图片转换成数据流
newimgstream = New MemoryStream
newimg.Save(newimgstream, System.Drawing.Imaging.ImageFormat.Jpeg)
img.Dispose()
newimg.Dispose()
g.Dispose()
'以字符串形式返回图片值
Return newimgstream.ToArray
Catch ex As Exception
img.Dispose()
newimg.Dispose()
imgstream.Dispose()
newimgstream.Dispose()
Return sImage
End Try
End Function




另:之前你说的第一点,怎么实现啊,
1:既然有类似的字段了,那就可以分组了,这些图片就可以合并成一个进行合并了。又不会影响图片的显示。
阿泰 2010-10-26
  • 打赏
  • 举报
回复
很好奇“我的解决办法就是对图片的值进行二次处理再打印” 这个是怎么处理的,能否分享一下呢
我自己做数据分析比较多些,对于这种可能涉及到某些业务单据的接触倒不多。

图片框你是指图片字段放到水晶报表上占用的那个空间吧,我也是说的这个。不是改变图片的实际大小。
我刚才还楞了一下,呵呵。
对于一个纵列上的图片字段,是不能做到不同的值使用不同大小的图片框吧,每次修改,这一列上的框的大小都会改变,所以做不到实时。

另外,请尽量不用使用感叹号,谢谢。
tenkol 2010-10-26
  • 打赏
  • 举报
回复
我刚想到一个办法,应该是跟你说的第一点一样的,我先做做看!
你说的图片大小,是指图片的大小还是装载图片的图片框的大小?改变图片的大小,我之前实现过,不知道你是否还记得关于图片失真的那个问题,我的解决办法就是对图片的值进行二次处理再打印,至于图片框,真的就是不知道是否有办法了,我之前想的其中一个办法,就是将相同的图片归组,同一组只打印第一笔记录的图片,其它记录的图片,则不打印,并将图片框大小设置成该记录其它字段值的大小,这样也能达到要求的效果。。。不过这是基于能够实时改变图片框大小的基础上的!
阿泰 2010-10-26
  • 打赏
  • 举报
回复
1:既然有类似的字段了,那就可以分组了,这些图片就可以合并成一个进行合并了。又不会影响图片的显示。
2:图片的大小可以改变,但是不可以只改其中的某个,要变所有这个字段上的图片都会一起变。
tenkol 2010-10-26
  • 打赏
  • 举报
回复
就算有匹配的字段或者组合,只要显示图片的需求还在,那么,还是无法逃避之前的问题。。。那么,有没有办法根据某个指定值来实时改变用来装载图片的框架的大小?

4,818

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧