文档章节

将图像转换为JPG或GIF字节流。

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:39
字数 619
阅读 6
收藏 0

      其实这个东西真的没有什么可谈的,完全都是一堆API函数的调用,不过呢,隔那么一段时间就有人在那里问,而且一般也得不到正确的答案,因此,我还是画蛇添足,共享一下这些调用的苦力活吧。

      从我个人的理解来看,有这种需求的人无非可能想做两件事,第一种是想搞类似屏幕传输或远程控制方面的东西,这个至少占了90%以上,而可以明确的告诉这部分朋友,JPG流实现远程控制是条死路。第二种是想实现保存JPG图像是压缩质量的预览,这个我在示例代码中做了一个简单的工程,大家可以参考。

      很多朋友都会用GDI+的GdipSaveImageToFile函数将图像保存为JPG文件,要获得对应的JPG字节流,一些折中的办法就是保存为文件后再通过二进制读取他,这实在是个弯路,在GDI+中还有一个函数GdipSaveImageToStream可将图像数据直接压缩为你指定格式的流对象。

      使用VB6或者VC6的朋友常常在程序中使用的是一些GDI的对象,比如Hbitmap或者Stdpicture,为了能调用GDI+的相关函数,必须先将他们转换为GDI+可识别的对象,这些转换函数有很多,例如GdipCreateBitmapFromScan0、GdipCreateBitmapFromHBITMAP、GdipCreateBitmapFromGdiDib、GdipCreateBitmapFromResource、GdipCreateBitmapFromHICON等等。

      同GdipLoadImageFromFile一样,对应也有GdipLoadImageFromStream函数,将流对象转换为Bitmap。

      列举转换为JPG字节流的部分代码如下:

 1  Public  Function GetJpgArrayForm24Dib(Img  As StdPicture,  Optional Quality  As  Long =  80As  Byte()
 2      Dim Image                    As  Long
 3      Dim IIStream                 As IUnknown
 4      Dim uEncCLSID( 3)             As  Long
 5      Dim aEncParams()             As  Byte
 6      Dim uEncParams               As EncoderParameters
 7      Dim Data()               As  Byte
 8      Dim Memory                   As  Long
 9      Dim OldMemory                As  Long
10      Dim MemorySize               As  Long
11     GdipCreateBitmapFromHBITMAP Img.Handle,  0, Image
12     GetEncoderClsID  " Image/jpeg ", uEncCLSID
13     uEncParams.Count =  1
14      ReDim aEncParams( 1  To  Len(uEncParams))
15      With uEncParams.Parameter
16         .NumberOfValues =  1
17         .Type = [EncoderParameterValueTypeLong]
18          Call CLSIDFromString(StrPtr(EncoderQuality), .GUID( 0))
19          If Quality <  0  Then
20             Quality =  0
21          ElseIf Quality >  100  Then
22             Quality =  100
23          End  If
24         .Value = VarPtr(Quality)
25      End  With
26      Call CopyMemory(aEncParams( 1), uEncParams,  Len(uEncParams))
27     
28     CreateStreamOnHGlobal  01, IIStream
29     GdipSaveImageToStream Image, IIStream, uEncCLSID( 0&), aEncParams( 1)
30     GetHGlobalFromStream  ByVal ObjPtr(IIStream), Memory
31     MemorySize = GlobalSize(Memory)
32     OldMemory = GlobalLock(Memory)
33      ReDim Data( 0  To MemorySize -  1)
34     CopyMemory Data( 0),  ByVal OldMemory, MemorySize
35     GlobalUnlock Memory
36     GdipDisposeImage Image
37     GetJpgArrayForm24Dib = Data
38  End Function

 

示例工程下载地址:http://files.cnblogs.com/Imageshop/BmpToJpgStream.rar

界面预览:

 

 

 

本文转载自:http://www.cnblogs.com/Imageshop/archive/2012/02/09/2344405.html

共有 人打赏支持
abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
GraphicsMagick的命令概览

GraphicsMagick的命令概览 ---------------------------------------------------------------------------- [ convert | identify | mogrify | composite | montage | compare | display | ......

mycms2013
2015/12/04
231
0
Imagemagick的用法

转载自:http://cache.baidu.com/c?m=9d78d513d99d1af31fa7837e7c4d88354c03df30698c814c68d4e20ed33707001935a5ec30236013a5c46b1600b83959fd833c6670437eb8c18ece08cabae13532d27c23706bd6......

jackjie2010
2012/05/21
0
0
如何在Ubuntu 16.04中创建GIF动图

导读 FFmpeg 是一款开源的音、视转换器,使用 FFmpeg 我们可以非常容易地转换和录制音视频文件,而 ImageMagick 是一款用于创建、编辑和合并位图图像的一款开源软件。 大家经常在新浪微薄、Q...

linuxprobe16
2016/12/16
18
0
如何在线制作gif图片?

最近想做个gif在线制作的网站,所以研究下了imagemagick和graphicsmagick制作gif图片 站已经做出来了:有兴趣的朋友可以先看看 http://www.sosogif.com/makeonline.jsp 源码下载地址1:http:...

赤尔宝丁
2016/05/04
93
0
将 GIF 图像转换为用于终端的 ASCII 码文本图形 - GIF for CLI

GIF for CLI 是 Google 在 GIF 31 周年纪念日推出的一款开源工具,能够将 GIF、短视频或对 Tenor GIF API 的查询转换为动画 ASCII 艺术,这意味着每次登录到编程工作站时,GIF 都会以 ASCII ...

匿名
06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

play framework 如何支持多数据源

有段时间没有写博客了,但今天又写一篇了,主要是因为这事有一丝自己的思考和动手实践,所以就记录下来了。 现有的问题: play 1.2.4 两台数据库服务器,但是play1.2.4 并不支持同时连接两台...

tuerqidi
12分钟前
0
0
Mysql only_full_group_by解析

查看当前数据库模式: select @@sql_mode; 原因: mysql 5.7中的sql_mode的值中包含'ONLY_FULL_GROUP_BY'; 处理:执行以下SQL set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,N......

bug_404
14分钟前
0
0
防止表单重复提交

1:前端方式(治标不治本) $("#admin-role-save").click(function(){//admin-role-save为submit的idvar ts=$(this);var ts_old_val=ts.val();ts.val("提交中....");ts.att...

uug
14分钟前
0
0
保持屏幕常亮

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 在act的created方法中调用即可,一般是播放视频的时候......

Carbenson
14分钟前
0
0
智能合约实施指南

与区块链技术一样,智能合约在商业领域也非常有价值。 为了让我们的读者彻底了解智能合约是什么以及它们如何影响现代商业的交易方式,我们准备了本指南。 集中商业模式正在给去中心化的模式让...

geek12345
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部