精华内容
下载资源
问答
  • python读取.hdr格式动态图片

    千次阅读 2019-02-26 16:28:28
    总结了两种在python中读取.hdr图片的方法 imageio读取.hdr import imageio imageio.plugins.freeimage.download() img = imageio.imread(hdr_path, format='HDR-FI') opencv读取 import cv2 ...

    总结了两种在python中读取.hdr图片的方法

    1. imageio读取.hdr
    import imageio
    
    imageio.plugins.freeimage.download()
    img = imageio.imread(hdr_path, format='HDR-FI')
    
    1. opencv读取
    import cv2
    
    img = cv2.imread(hdr_path, flags = cv2.IMREAD_ANYDEPTH)
    cv2.imshow('1',img)
    cv2.waitKey (0)
    

    请注意这里一定要使用cv2.IMREAD_ANYDEPTH,因为hdr图片的像素位宽比普通图片大很多,直接读取的话会被截断,故而读出来的值有误。
    显示结果如下所示:
    opencv read hdr
    当然这里的图片显示时自动ToneMapping了,但是img中读取的数据还是原先保存的完整数据。

    展开全文
  • android图片格式

    千次阅读 2018-03-09 15:44:27
    目前移动端Android平台原生支持的图片格式主要:JPEG、PNG、GIF、BMP和WebP(自从android4.0开始支持),但是在Android应用开发中能够使用的编解码格式只有其中的三种: JPEG、PNG、WebP 图片格式可以通过...

    *

    android图片格式

    *
    目前移动端Android平台原生支持的图片格式主要有:JPEG、PNG、GIF、BMP和WebP(自从android4.0开始支持),但是在Android应用开发中能够使用的编解码格式只有其中的三种:
    JPEG、PNG、WebP
    图片格式可以通过查看Bitmap类的CompressFormat枚举值来确定。

    public static enum CompressFormat{
        JPEG,
        PNG,
        WEBP;
    
        private CompressFormat(){
    
        }
    }
    • JPEG
      JPEG(发音为/jay-peg/)是一种广泛使用的有损压缩图片标准格式,它不支持透明和多帧动画,一般摄影类作品最终都是以JPEG格式展示。通过控制压缩比,可以调整图片的大小。
    • PNG
      PNG是一种无损压缩图片格式,它支持完整的透明通道,从图像处理领域讲,JPEG只有RGB三个通道,而PNG有ARGB四个通道。由于是无损压缩,因此PNG图片占用空间一般比较大,会无形中添加最终APP的大小,在做APP瘦身时一般都要对PNG图片进行处理以减小其占用的体积。
    • GIF
      GIF 是- 一种古老的图片格式,它诞生于1987 年,随着初代互联网流行开来。它的特点是支持多帧动画。大家对这种格式肯定不陌生,社交平台上面发送的各种动态表情,大部分都是基于GIF 来实现的。
    • WebP
      相比前面几种图片格式,WebP (发音为/weppy/ )算是一一个初生儿了,由Google 在2010
      年发布,它支持有损和无损压缩、支持完整的透明通道、也支持多帧动画,是一种比较理想的图片格式。目前国内很多主流APP都已经应用了WebP,例如微信、微博.淘宝等。在既保证图片质量又要限制图片大小的需求下,WebP应该是首选。
    展开全文
  • 移动端图片格式调研

    千次阅读 2015-11-05 10:56:59
    本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。原文地址: ...合理的图片格式选用和优化可以为你节省带宽、提升视觉效果。在这篇文章里我会分析一下目前主流和新兴的几种图片格式...

    本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。

    原文地址: http://blog.ibireme.com/2015/11/02/mobile_image_benchmark/

    图片通常是移动端流量耗费最多的部分,并且占据着重要的视觉空间。合理的图片格式选用和优化可以为你节省带宽、提升视觉效果。在这篇文章里我会分析一下目前主流和新兴的几种图片格式的特点、性能分析、参数调优,以及相关开源库的选择。

    Index
    几种图片格式简介
    移动端图片类型的支持情况
    静态图片的编码与解码
    JPEG
    PNG
    WebP
    BPG
    动态图片的编码与解码
    GIF
    APNG
    WebP
    BPG
    动图性能对比


    几种图片格式的简介

    首先谈一下大家耳熟能详的几种老牌的图片格式吧:

    JPEG 是目前最常见的图片格式,它诞生于 1992 年,是一个很古老的格式。它只支持有损压缩,其压缩算法可以精确控制压缩比,以图像质量换得存储空间。由于它太过常见,以至于许多移动设备的 CPU 都支持针对它的硬编码与硬解码。

    PNG 诞生在 1995 年,比 JPEG 晚几年。它本身的设计目的是替代 GIF 格式,所以它与 GIF 有更多相似的地方。PNG 只支持无损压缩,所以它的压缩比是有上限的。相对于 JPEG 和 GIF 来说,它最大的优势在于支持完整的透明通道。

    GIF 诞生于 1987 年,随着初代互联网流行开来。它有很多缺点,比如通常情况下只支持 256 种颜色、透明通道只有 1 bit、文件压缩比不高。它唯一的优势就是支持多帧动画,凭借这个特性,它得以从 Windows 1.0 时代流行至今,而且仍然大受欢迎。

    在上面这些图片格式诞生后,也有不少公司或团体尝试对他们进行改进,或者创造其他更加优秀的图片格式,比如 JPEG 小组的 JPEG 2000、微软的 JPEG-XR、Google 的 WebP、个人开发者发布的 BPG、FLIF 等。它们相对于老牌的那几个图片格式来说有了很大的进步,但出于各种各样的原因,只有少数几个格式能够流行开来。下面三种就是目前实力比较强的新兴格式了:

    APNG 是 Mozilla 在 2008 年发布的一种图片格式,旨在替换掉画质低劣的 GIF 动画。它实际上只是相当于 PNG 格式的一个扩展,所以 Mozilla 一直想把它合并到 PNG 标准里面去。然而 PNG 开发组并没有接受 APNG 这个扩展,而是一直在推进它自己的 MNG 动图格式。MNG 格式过于复杂以至于并没有什么系统或浏览器支持,而 APNG 格式由于简单容易实现,目前已经渐渐流行开来。Mozilla 自己的 Firefox 首先支持了 APNG,随后苹果的 Safari 也开始有了支持, Chrome 目前也已经尝试开始支持 ,可以说未来前景很好。

    WebP 是 Google 在 2010 年发布的图片格式,希望以更高的压缩比替代 JPEG。它用 VP8 视频帧内编码作为其算法基础,取得了不错的压缩效果。它支持有损和无损压缩、支持完整的透明通道、也支持多帧动画,并且没有版权问题,是一种非常理想的图片格式。借由 Google 在网络世界的影响力,WebP 在几年的时间内已经得到了广泛的应用。看看你手机里的 App:微博、微信、QQ、淘宝、网易新闻等等,每个 App 里都有 WebP 的身影。Facebook 则更进一步,用 WebP 来显示聊天界面的贴纸动画。

    BPG 是著名程序员 Fabrice Bellard 在去年 (2014年) 发布的一款超高压缩比的图片格式。这个程序员有些人可能感觉面生,但说起他的作品 FFmpeg、QEMU 大家想必是都知道的。BPG 使用 HEVC (即 H.265) 帧内编码作为其算法基础,就这点而言,它毋庸置疑是当下最为先进的图片压缩格式。相对于 JP2、JPEG-XR、WebP 来说,同等体积下 BPG 能提供更高的图像质量。另外,得益于它本身基于视频编码算法的特性,它能以非常小的文件体积保存多帧动画。 Fabrice Bellard 聪明的地方在于,他知道自己一个人无法得到各大浏览器厂商的支持,所以他还特地开发了 Javascript 版的解码器,任何浏览器只要加载了这个 76KB 大小的 JS 文件,就可以直接显示 BPG 格式的图片了。目前阻碍它流行的原因就是 HEVC 的版权问题和它较长的编码解码时间。尽管这个图片格式才刚刚发布一年,但已经有不少厂子开始试用了,比如阿里腾讯

    移动端图片类型的支持情况

    目前主流的移动端对图片格式的支持情况如何呢?我们分别来看一下 Android 和 iOS 目前的图片编解码架构吧:

    mobile_image_arch

    Android 的图片编码解码是由 Skia 图形库负责的,Skia 通过挂接第三方开源库实现了常见的图片格式的编解码支持。目前来说,Android 原生支持的格式只有 JPEG、PNG、GIF、BMP 和 WebP (Android 4.0 加入),在上层能直接调用的编码方式也只有 JPEG、PNG、WebP 这三种。目前来说 Android 还不支持直接的动图编解码。

    iOS 底层是用 ImageIO.framework 实现的图片编解码。目前 iOS 原生支持的格式有:JPEG、JPEG2000、PNG、GIF、BMP、ICO、TIFF、PICT,自 iOS 8.0 起,ImageIO 又加入了 APNG、SVG、RAW 格式的支持。在上层,开发者可以直接调用 ImageIO 对上面这些图片格式进行编码和解码。对于动图来说,开发者可以解码动画 GIF 和 APNG、可以编码动画 GIF。

    两个平台在导入第三方编解码库时,都多少对他们进行了一些修改,比如 Android 对 libjpeg 等进行的调整以更好的控制内存,iOS 对 libpng 进行了修改以支持 APNG,并增加了多线程编解码的特性。除此之外,iOS 专门针对 JPEG 的编解码开发了 AppleJPEG.framework,实现了性能更高的硬编码和硬解码,只有当硬编码解码失败时,libjpeg 才会被用到。

    静态图片的编码与解码

    由于我目前主要是做 iOS 开发,所以下面的性能评测都是基于 iPhone 的,主要测试代码可以在这里看到测试素材很少,只有两个:

    dribbble512_pngcrushlena512_weibo

    第一张是Dribbble 的 Logo,包含 Alpha 通道,用于测试简单的、图形类的图像。
    第二张经典的 Lena 图,用于测试照片类的、具有丰富细节的图像。
    每个图像都有 64x64、128x128、256x256、512x512 四种分辨率。
    测试素材过少可能导致某些测试不够准确,但作为参考大致是没问题的。

    JPEG

    目前比较知名的 JPEG 库有以下三个:

        libjpeg开发时间最早,使用最广泛的 JPEG 库。由于 JPEG 标准过于复杂和模糊,并没有其他人去实现,所以这个库是 JPEG 的事实标准。

        libjpeg-turbo一个致力于提升编解码速度的 JPEG 库。它基于 libjpeg 进行了改造,用 SIMD 指令集 (MMX、SSE2、NEON) 重写了部分代码,官网称相对于 libjpeg 有 2 到 4倍的性能提升。

        MozJPEG 一个致力于提升压缩比的 JPEG 库。它是 Mozilla 在 2014 年发布的基于 libjpeg-turbo 进行改造的库,相对于 libjpeg 有 5% ~ 15 的压缩比提升,但相应的其编码速度也慢了很多。

    除了上面这三个库,苹果自己也开发了一个 AppleJPEG,但并没有开源。其调用了芯片提供的 DSP 硬编码和硬解码的功能。虽然它不如上面这三个库功能完善,但其性能非常高。在我的测试中,其编解码速度通常是 libjpeg-turbo 的 1~2 倍。可惜的是,目前开发者并不能直接访问这个库。

    下面是 ImageIO (AppleJPEG/libpng) 在 iPhone 6 上的编解码性能:

    jpeg_bench_dribbblejpeg_bench_lena

    可以看到,JPEG 编码中 quality 越小,图片体积就越小,质量越也差,编码时间也越短。解码时间并没有很大的差距,可能是其大部分时间消耗在了函数调用、硬件调用上。苹果在自己的相册 Demo 中提供的 quality 的默认值是 0.9,在这个值附近,图像质量和体积、编码解码时间之间都能取得不错的平衡。

    PNG

    相对于 JPEG 来说,PNG 标准更为清晰和简单,因此有很多公司或个人都有自己的 PNG 编码解码实现。但目前使用最广的还是 PNG 官方发布的 libpng 库。iOS 和 Android 底层都是调用这个库实现的 PNG 编解码。

    下面是 PNG 在 iPhone 6 上的编解码性能:

    jpeg_png_bench

    可以看到,在编解码图形类型(颜色少、细节少)的图片时,PNG 和 JPEG 差距并不大;但是对于照片类型(颜色和细节丰富)的图片来说,PNG 在文件体积、编解码速度上都差 JPEG 不少了。

    和 JPEG 不同,PNG 是无损压缩,其并不能提供压缩比的选项,其压缩比是有上限的。目前网上有很多针对 PNG 进行优化的工具和服务,旨在提升 PNG 的压缩比。下面是常见的几个 PNG 压缩工具的性能对比:

    png_tools_bench

    pngcrush 是 Xcode 自带的 PNG 压缩工具,相对于设计师用 Photoshop 生成的图片来说,它能取得不错的压缩效果。ImageOptim 则更进一步,对每张图用多种缩算法进行比对,选择压缩比更高的结果,进一步缩小了文件体积。TinyPNG.com 相对于其他工具来说,压缩比高得不像话。它启用了类似 GIF 那样的颜色索引表对 PNG 进行压缩,所以会导致颜色丰富的图片丢失掉一部分细节。如果使用 TinyPNG 的话,最好在压缩完成后让设计师看一下颜色效果是否可以接受。

    WebP

    WebP 标准是 Google 定制的,迄今为止也只有 Google 发布的 libwebp 实现了该的编解码 。 所以这个库也是该格式的事实标准。

    WebP 编码主要有几个参数:

        losslessYES:有损编码 NO:无损编码。WebP 主要优势在于有损编码,其无损编码的性能和压缩比表现一般。

        quality: [0~100] 图像质量,0表示最差质量,文件体积最小,细节损失严重,100表示最高图像质量,文件体积较大。该参数只针对有损压缩有明显效果。Google 官方的建议是 75,腾讯在对 WebP 评测给出的建议也是 75。在这个值附近,WebP 能在压缩比、图像质量上取得较好的平衡。

        method: [0~6] 压缩比,0表示快速压缩,耗时短,压缩质量一般,6表示极限压缩,耗时长,压缩质量好。该参数也只针对有损压缩有明显效果。调节该参数最高能带来 20% ~ 40% 的更高压缩比,但相应的编码时间会增加 520 倍。Google 推荐的值是 4

    对于编码无损图片来说,quality=0, method=0~3 是相对来说比较合适的参数,能够节省编码时间,同时也有不错的压缩比。无损编码图片,quality=75, method=2~4 是比较合适的参数,能在编码时间、图片质量、文件体积之间有着不错的平衡。

    WebP 解码有三个参数:

        use_threads: 是否启用 pthread 多线程解码。该参数只对宽度大于 512 的有损图片起作用。开启后内部会用多线程解码,CPU 占用会更高,解码时间平均能缩短 10%~20%。

        bypass_filtering: 是否禁用滤波。该参数只对有损图片起作用,开启后大约能缩短 5%~10% 的解码时间,但会造成一些颜色过渡平滑的区域产生色带(banding)。

        no_fancy_upsampling: 是否禁用上采样。该参数只对有损图片起作用。在我的测试中,开启该参数后,解码时间反而会增加 525%,同时会造成一些图像细节的丢失,线条边缘会增加杂色,显得不自然。

    通常情况下,这三个参数都设为 NO 即可,如果要追求更高的解码速度,则可以尝试开启 use_threads 和 bypass_filtering 这两个参数。而 no_fancy_upsampling 在任何情况下都没必要开启。

    由于 WebP 测试数据较多,这里只贴一下 512x512 大小的一部分测试结果,感兴趣的可以看文章结尾处的 Excel 附件。

    webp_bench

    对于简单的图形类型的图像(比如 App 内的各种 UI 素材),WebP 无损压缩的文件体积和解码速度某些情况下已经比 PNG 还要理想了,如果你想要对 App 安装包体积进行优化,可以尝试一下 WebP。

    对于复杂的图像(比如照片)来说,WebP 无损编码表现并不好,但有损编码表现却非常棒。相近质量的图片解码速度 WebP 相距 JPEG 也已经相差不大了,而文件压缩比却能提升不少。

    BPG

    BPG 是目前已知最优秀的有损压缩格式了,它能在相同质量下比 JPEG 减少 50% 的体积。下面是经典的 Lena 图的对比,你也可以在这里看到大量其他图片的 BPG、JPEG、JPEG2000、JPEG-XR、WebP 压缩效果的在线对比,效果非常明显。

    bpg_demo

    BPG 目前只有作者发布的 libbpg 可用。但作者基于 libbpg 编译出了一个 Javascript 解码器,很大的扩展了可用范围。bpg 可以以无损和有损压缩两种方式进行编码,有损压缩时可以用 quality 参数控制压缩比,可选范围为 0~51,数值越大压缩比越高。通常来说,25 附近是一个不错的选择,BPG 官方工具默认值是 28。

    libbpg 目前并没有针对 ARM NEON 做优化,所以其在移动端的性能表现一般。下面是 iPhone 6 上的性能测试:

    bpg_bench

    由于 bpg 编码时间太长,我并没有将数据放到表格里。可以看到相同质量下,BPG 的解码速度还是差 JPEG 太多,大约慢了 35 倍。目前来说,BPG 适用于那些对流量非常敏感,但对解码时间不敏感的地方。从网上的新闻来看,手机淘宝和手机QQ都已经有所尝试,但不清楚他们是否对 BPG 解码进行了优化。

    动态图片的编码与解码

    动图在网络上非常受欢迎,它近似视频,但通常实现简单、文件体积小,应用范围非常广泛。动图的始祖是 GIF,它自 Windows 1.0 时代就在互联网上流行开来,直到今天仍然难以被其他格式取代。尽管它非常古老,但其所用的原理和今天几种新兴格式几乎一样。

    下面是一张 GIF 格式的 QQ 大表情:

    bench_gif_demo

    这张表情由 6 幅静态图构成,每幅图片有一定的存活时间,连贯播放就形成了动画:

    bench_gif_demo1

    这几张图中,大部分内容是相近的,为了压缩文件体积,通常动图格式都支持一些特殊的方式对相似图片进行裁剪,只保留前后帧不同的部分:

    bench_gif_demo2

    在解码动图时,解码器通常采用所谓"画布模式"进行渲染。想象一下:播放的区域是一张画布,第一帧播放前先把画布清空,然后完整的绘制上第一帧图;播放第二帧时,不再清空画布,而是只把和第一帧不同的区域覆盖到画布上,就像油画的创作那样。

    像这样的第一帧就被称为关键帧(即 I 帧,帧内编码帧),而后续的那些通过补偿计算得到的帧被称为预测编码帧(P帧)。一个压缩的比较好的动图内,通常只有少量的关键帧,而其余都是预测编码帧;一个较差的压缩工具制作的动图内,则基本都是关键帧。不同的动图压缩工具通常能得到不同的结果。

    除此之外,动图格式通常有更为详细的参数控制每一帧的绘制过程,下面是 GIF/APNG/WebP 通用的几个参数:

    Disposal Method (清除方式) 
       Do Not Dispose:把当前帧增量绘制到画布上,不清空画布。
       Restore to Background:绘制当前帧之前,先把画布清空为默认背景色。
       Restore to Previous:绘制下一帧前,把先把画布恢复为当前帧的前一帧

    Blend Mode (混合模式) 
       Blend None: 绘制时,全部通道(包含Alpha通道)都会覆盖到画布,相当于绘制前先清空画布的指定区域。
       Blend over:绘制时,Alpha 通道会被合成到画布,即通常情况下两张图片重叠的效果。

    上面这些技术,就是常见动图格式的基础了,下面分别介绍一下不同动图格式的特点。

    GIF

    GIF 缺陷非常明显:它通常只支持 256 色索引颜色,这导致它只能通过抖动、差值等方式模拟较多丰富的颜色;它的 Alpha 通道只有 1 bit,这意味着一个像素只能是完全透明或者完全不透明。

    gif_apng_demo

    上面这是腾讯博客里的一张演示图,可以看到 GIF 由于 Alpha 通道的问题,产生了严重的"毛边"现象。目前通常的解决方案是在图片的边缘加一圈白边,以减轻这种视觉效果:

    gif_wrong_demo

    可以仔细观察一下 QQ、微信等 App 里面的动画表情,几乎每个表情都被一圈白边所环绕,不得不说是一种很无奈的解决方案。

    GIF 的制作工具有很多,但效果好、压缩比高的工具非常少。对于已经制作好的 GIF 来说,用 imagemagick 处理一下可以把文件体积压缩不少。如果需要将视频转为 GIF,Cinemagraph Pro 是个不错的傻瓜化工具。这里有一篇文章介绍如何用 ffmpeg 压缩 GIF,虽然参数调节有点麻烦,但效果非常理想。

    下面是没有经过优化的 GIF 和经过 ffmpeg 优化编码的 GIF,可以看到差距非常大。

    bbb-trans bbb-nodither

    APNG

    APNG 目前并没有被 PNG 官方所接受,所以 libpng 并不能直接解码 APNG。但由于 APNG 只是基于 PNG 的一个简单扩展,所以在已经支持 PNG 的平台上,可以很轻松的用少量代码实现 APNG 的编解码。Chromium 为了支持 APNG 播放,只增加了不到 600行代码 ,我自己也用大概 500 行 C 代码实现了一个简单的 APNG 编解码工具。另外,在支持 canvas 的浏览器上,可以用 apng-canvas 直接显示 APNG 动画。APNG 压缩最好的工具目前是 apngasm,大部分图形化工具比如腾讯的 iSparta 都是基于这个工具开发的。

    就目前而言, APNG 是 GIF 最好的替代了:实现简单,可用范围广,压缩比不错,显示效果好。

    WebP

    WebP 在 2010 年 发布时并没有支持动图。2012 年 libwebp v0.2 的时候,Google 才开始尝试支持动画,但其实现有很多问题,性能也非常差,以至于 Chrome 团队一直都没有接受。直到 2013 年,libwebp v0.4 时,动画格式才稳定下来才被 Chrome 所接受。

    WebP 动图实际上是把多个单帧 WebP 数据简单打包到一个文件内,而并不是由单帧 WebP 扩展而来,以至于动图格式并不能向上兼容静态图。如果要支持动图,首先在编译 libwebp 时需要加上 demux 模块,解码 WebP 时需要先用 WebPDemuxer 尝试拆包,之后再把拆出来的单帧用 WebPDecode 解码。为了方便编译,我写了个脚本用于打包 iOS 的静态库,加入了 mux 和 demux 模块。

    Google 提供了两个简单的命令行工具用于制作动图:gif2webp 能把 GIF 转换为 WebP, webpmux 能把多个 WebP 图片打包为动态图,并且有着很多参数可以调节。这两个工具对相近帧的压缩并不太理想,以至于有的情况下压缩比还不如 APNG,但除此以外也没有其他什么更好的工具可以用了。

    BPG

    BPG 本身是基于 HEVC (H.265) 视频编码的,其最开始设计时就考虑到了动图的实现。由于它充分利用了 HEVC 的高压缩比和视频编码的特性,其动图压缩比远超其他格式。这里这里有几张 BPG 动图示例,可以看到相同质量下 BPG 动图只有 APNG/WebP/GIF 几十分之一的大小。

    我在这里写了个简单的利用 libbpg 解码动图的方法,如有需要可以参考下。

    动图性能对比

    我把下面这张 GIF 分别转为 WebP、APNG、BPG 动图,并在 iPhone 6 上对其所有帧进行解码。

    gif_ermilio

    评测结果如下:

    anim_bench

    APNG 在文件体积上比 GIF 略有优势,解码时间相差不多。WebP 在体积和解码时间上都具有较大的优势。BPG 在体积上优势最大,但解码时间也最长。这么看来,APNG 和 WebP 都是不错的选择,而 BPG 还有待性能优化。

    最后做一个小广告:如果你是 iOS 平台的开发者,可以试试我开发的 YYWebImage,它支持 APNG、WebP、GIF 动图的异步加载与播放、编码与解码,支持渐进式图像加载,可以替代 SDWebImage、PINRemoteImage、FLAnimatedImage 等开源库。

    评测数据

    上面提到的所有评测数据表格:image_benchmark.xlsx 推荐用 Excel 打开查看。

    展开全文
  • 在水晶报表中动态显示任意格式图片 如何在水晶报表中动态显示任意格式图片 前段时间,Accounting 项目内需要在水晶报表中动态显示任意格式图片。但是,水晶报表只支持OleDb的静态加载图片动态在 ...

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

    展开全文
  • HEIF图片存储格式探秘

    千次阅读 2017-12-11 18:30:43
    HEIF图片存储格式
  • 图片格式WEBP全面解析

    千次阅读 2018-03-03 23:07:24
    前言 不管是 PC 还是移动端,图片一直是流量大头,...但如今对于 JPEG、PNG 和 GIF 这些图片格式的优化几乎已经达到了极致, 若想改变现状开辟新局面,便要釜底抽薪的胆量和气魄,而 Google 给了我们一个新选择...
  • 常见图片格式及其区别小结

    千次阅读 2019-02-17 16:50:39
    .jpg的全称是Joint Photographic ...静态的GIF格式图片和JPG格式图片无异,而动态的GIF图片则是由多幅图片保存为一个图片,形成动画效果而制成的.然而,它们只能包含最多 256 种颜色,因此并不适合用在照片上,...
  • 各种图片格式之间的差别

    千次阅读 2019-05-22 17:37:45
    图片格式之间的差别 jpg与jpeg 其优点为兼容性高、传输速度快、内存小。它是一种有损压缩方案,可在保持较高图片质量的前提下,被压缩到原图内存的二十分之一大小,令细节和质量流失。但同时文件比较小,一些相机...
  • 主要代码在这个自定义的View类里,此代码是参考了apidemos里BitmapDecode.java: 注意的地方已用红色的标注了. 我试过的android版本:4.0.4, 4.11, 4.12 public class GifView extends View { private static final...
  • python 将webp的图片格式转换为jpg格式

    千次阅读 2019-08-19 20:33:35
    主要是因为今天爬取一个网站【漫画柜】,然后图片格式读取字节下载下来不能用画图什么的打开,然后下载后缀为webp可以在浏览器中打开,但是如何下载弄成为jpg或者png格式的呐,然后一顿搜索。。。最终找到了一个博主...
  • 生成条码的算法是现成的,只要把条码图片展示在流水号文字之下就行。 本想用jQuery的ajax调用ashx返回二进制流,正如返回json或text、html那样,但查了一下好像dataType暂还不支持这么做。但我们知道ashx可以...
  • 基于C++ GDI+技术实现多张图片合并生成Gif动画格式图片的方案。 【1】支持bmp、jpg、tif、png等格式图片的合并 【2】支持图片尺寸、循环次数、图片持续时间的设定
  • 前端常见图片格式整理

    千次阅读 2016-06-26 22:30:32
    前端常见图片格式整理
  • 博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。... Android UI 中最离不开的就是图片了,图片可以由很多种格式构成,比如 png、jpeg、webp 格式等等。我们时候会发现同一张的图片不同的大...
  • 文件格式、后缀名、图片格式详解

    千次阅读 2019-03-12 08:51:19
    .acm:音频压缩管理驱动程序,为Windows系统提供各种声音格式的编码和解码功能 .aif:声音文件,支持压缩,可以使用WindowsMediaPlayer和QuickTimePlayer播放 .AIF:音频文件,使用WindowsMediaPlayer播放 .AIFC:...
  • 最近老总说要把视图里的图标改成动态的,让其能够更形象的显示状态,所以我就百度了一下,还真没很详细的资料,但最终我还是东凑凑,西凑凑给凑出来了,下面说一下详细步骤吧: 1。下载 PictureEx.h和PictureEx.cpp...
  • 当转换远程图片时,可借助canvas的toDataURL方法:1. 通过Image对象或是img元素发起请求,不存在跨域问题;2. 由于canvas固有限制,该方法只能转换静态图片。或借助FileReader的readAsDataURL方法:1. 通过fetch或是...
  • 但是可以通过Import, Export的方式, 把动态图片的帧导出到视频格式的文件中, 再导入Mathematica中, 然后重导出最终生成gif格式 http://community.wolfram.com/groups/-/m/t/86994;jsessionid=F81DC17EA304180AFB...
  • Android显示gif格式图片

    千次阅读 2013-08-07 13:41:09
    大家知道,在Android中使用ImageView来显示gif格式图片,我们无法得到gif格式图片的效果,它只会停在第一帧上,而不会继续。这时只能看到一张静态的图片,这里我们可以使用个简单的方法,即是使用Movie来显示...
  • 其实修改gif动态图片的方式很多,这里就不列举了。闲话不多说 使用PS修改的必要条件是必须安装Quick Time Play软件支持,很多软件的多媒体设计离不开它,如,绘声绘影等。 安装完以后即可实现如下按照图片操作...
  • 本篇博客记录如何使用 Jupyter Notebook 显示图片,第一种情况为使用 python 绘图时,网页中如何显示静态图片和动态图片;第二种情况为使用 Jupyter Notebook 做笔记时,在网页中调用本地的图片进行展示。 1. 显示...
  • WordPress 支持 WebP格式图片上传方法

    千次阅读 2019-12-26 20:49:51
    WebP(发音:weppy)是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,派生自影像编码格式VP8,被认为是WebM多媒体格式的姊妹项目,是由Google在购买On2 Technologies后发展出来,以BSD授权条款发布...
  • Java处理Webp图片格式转换

    千次阅读 2018-09-09 05:49:08
    Webp是Google推出的一种新型图片格式,相比于 传统的PNG/JPG图片有着更小体积的优势,在Web中有着广泛的应用。由于Webp格式推出比较晚, Jdk 内置的图片编解码库对此并不支持。 网上给出的Java环境解决方案往往需要...
  • 制作网页常见图片格式及特性介绍

    千次阅读 2019-05-22 15:22:39
    图片是网页制作中很重要的素材,图片不同的格式,每种格式都有自己的特性,了解这些特性可以方便我们在制作网页时选取合适的图片格式。常见的图片格式及一些特性如下: 1. psd photoshop的专用格式,网页上一般...
  • ReaConverter Pro是一款非常好用的图片格式转换工具,可以将图片转换为PNG,JPG,TIF或BMP等多种其他格式,使用基于资源管理器的布局来查找和访问图片,支持批处理,也支持在大量文件格式之间转换,无论什么文件格式...
  • Google最新的图片格式WEBP全面解析

    万次阅读 2016-07-06 20:44:18
    前言 不管是 PC 还是移动端,图片一直是流量大头,以...但如今对于 JPEG、PNG 和 GIF 这些图片格式的优化几乎已经达到了极致, 若想改变现状开辟新局面,便要釜底抽薪的胆量和气魄,而 Google 给了我们一个新选
  • 在使用openlayers.layer.image时,请问所加载的图片格式规定的吗?webp的格式可行吗?顺便再加一个问题。。。如果可行,请问可以将webp转换成svg的格式么?要怎么转呢?谢谢!!!(纠结好长时间,快点来个大神...
  • 各种Web图片格式及其应用场景

    千次阅读 2018-09-07 19:02:14
    通常网页在显示的图片(图形)的时候,以下几种格式:GIF、PNG、JPG、SVG,还有个比较新的WebP格式。 ▍GIF 优点:GIF是动态的;支持无损耗压缩和透明度。 缺点:的详细的图片和写实摄影图像会丢失颜色信息...
  • 我现在在做一个类似壁纸的应用,app获取服务端图片展示,一半图片是webp格式。我们提供下载和分享功能。但是webp图片下载到手机本地不能打开,...是要把服务端的图片格式都转换为jpg或者png吗?代码能实现转换吗
  • 在资源文件中存放 image_1.png, image_2.png, image_3.png 三张图片 , 根据传入参数动态引用对应的图片 , 三个解决方法 根据R.drawable.xx动态引用是错误的 , 因为每个这种id对应着R文件中的一个id,如果没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 189,258
精华内容 75,703
关键字:

动态图片的格式都有什么格式