文档章节

将图像转换为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 ...

匿名
2018/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

recv send 的 MSG_DONTWAIT 、 MSG_WAITALL 参数

基本概念: 阻塞IO:: socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。 非阻塞IO:: 非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。 ...

shzwork
23分钟前
2
0
怎么给开源项目提PR?

1. Fork 你想要提交 PR 的项目 2. 下载到本地 相关步骤如下: 在你需要的文件夹下面,右键使用 git bash 命令,打开 git 命令框 执行如下指令可将项目代码下载到当前目录 1代码仓库地址为示例...

xiaomin0322
26分钟前
2
0
浅复制与深复制概念

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制...

GodIsCj
26分钟前
1
0
如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快...

阿里云官方博客
49分钟前
2
0
如何 SSH 到 Linux 服务器里的特定目录及执行命令?

这种操作对于新手来讲特别常见,良许之前也是这样。在本文,老司机将带你来进行更高效的操作,只需一步即可达到你想要的效果。 而且,不仅仅是实现快速进入到 Linux 服务器特定的目录,还可以...

架构师springboot
53分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部