GDI+_SavePic
- Option Explicit
- Private Const UnitPixel As Long =
- Private Const EncoderQuality As String = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"
- Private Type GdiplusStartupInput
- GdiplusVersion As Long
- DebugEventCallback As Long
- SuppressBackgroundThread As Long
- SuppressExternalCodecs As Long
- End Type
- Private Enum EncoderParameterValueType
- EncoderParameterValueTypeByte =
- EncoderParameterValueTypeASCII =
- EncoderParameterValueTypeShort =
- EncoderParameterValueTypeLong =
- EncoderParameterValueTypeRational =
- EncoderParameterValueTypeLongRange =
- EncoderParameterValueTypeUndefined =
- EncoderParameterValueTypeRationalRange =
- End Enum
- Private Type EncoderParameter
- GUID( To ) As Long
- NumberOfValues As Long
- Type As EncoderParameterValueType
- Value As Long
- End Type
- Private Type EncoderParameters
- Count As Long
- Parameter As EncoderParameter
- End Type
- Private Type ImageCodecInfo
- ClassID( To ) As Long
- FormatID( To ) As Long
- CodecName As Long
- DllName As Long
- FormatDescription As Long
- FilenameExtension As Long
- MimeType As Long
- Flags As Long
- Version As Long
- SigCount As Long
- SigSize As Long
- SigPattern As Long
- SigMask As Long
- End Type
- Private Declare Function GdiplusStartup Lib "gdiplus" (Token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = ) As Long
- Private Declare Sub GdiplusShutdown Lib "gdiplus" (ByVal Token As Long)
- Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal hImage As Long, ByVal sFilename As Long, clsidEncoder As Any, encoderParams As Any) As Long
- Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As Long
- Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" (ByVal hbm As Long, ByVal hPal As Long, Bitmap As Long) As Long
- Private Declare Function GdipGetImageEncodersSize Lib "gdiplus" (numEncoders As Long, Size As Long) As Long
- Private Declare Function GdipGetImageEncoders Lib "gdiplus" (ByVal numEncoders As Long, ByVal Size As Long, Encoders As Any) As Long
- Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
- Private Declare Function lstrlenW Lib "kernel32" (ByVal psString As Any) As Long
- Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszProgID As Long, pCLSID As Any) As Long
- Private Declare Function GdipBitmapSetResolution Lib "gdiplus" (ByVal Bitmap As Long, ByVal xdpi As Single, ByVal ydpi As Single) As Long
- Public Enum ImageFileFormat
- Bmp =
- Jpg =
- Png =
- Gif =
- End Enum
- Public Function SaveStdPicToFile(Stdpic As StdPicture, ByVal FileName As String, _
- Optional ByVal FileFormat As ImageFileFormat = Jpg, _
- Optional ByVal JpgQuality As Long = , _
- Optional Resolution As Single) As Boolean
- Dim CLSID() As Long
- Dim Bitmap As Long
- Dim Token As Long
- Dim Gsp As GdiplusStartupInput
- Gsp.GdiplusVersion = 'GDI+ 1.0版本
- GdiplusStartup Token, Gsp '初始化GDI+
- GdipCreateBitmapFromHBITMAP Stdpic.Handle, Stdpic.hPal, Bitmap
- If Bitmap <> Then '说明我们成功的将StdPic对象转换为GDI+的Bitmap对象了
- GdipBitmapSetResolution Bitmap, Resolution, Resolution
- Select Case FileFormat
- Case ImageFileFormat.Bmp
- If Not GetEncoderClsID("Image/bmp", CLSID) = - Then
- SaveStdPicToFile = (GdipSaveImageToFile(Bitmap, StrPtr(FileName), CLSID(), ByVal ) = )
- End If
- Case ImageFileFormat.Jpg 'JPG格式可以设置保存的质量
- Dim aEncParams() As Byte
- Dim uEncParams As EncoderParameters
- If GetEncoderClsID("Image/jpeg", CLSID) <> - Then
- uEncParams.Count = ' 设置自定义的编码参数,这里为1个参数
- If JpgQuality < Then
- JpgQuality =
- ElseIf JpgQuality > Then
- JpgQuality =
- End If
- ReDim aEncParams( To Len(uEncParams))
- With uEncParams.Parameter
- .NumberOfValues =
- .Type = EncoderParameterValueTypeLong ' 设置参数值的数据类型为长整型
- Call CLSIDFromString(StrPtr(EncoderQuality), .GUID()) ' 设置参数唯一标志的GUID,这里为编码品质
- .Value = VarPtr(JpgQuality) ' 设置参数的值:品质等级,最高为100,图像文件大小与品质成正比
- End With
- CopyMemory aEncParams(), uEncParams, Len(uEncParams)
- SaveStdPicToFile = (GdipSaveImageToFile(Bitmap, StrPtr(FileName), CLSID(), aEncParams()) = )
- End If
- Case ImageFileFormat.Png
- If Not GetEncoderClsID("Image/png", CLSID) = - Then
- SaveStdPicToFile = (GdipSaveImageToFile(Bitmap, StrPtr(FileName), CLSID(), ByVal ) = )
- End If
- Case ImageFileFormat.Gif
- If Not GetEncoderClsID("Image/gif", CLSID) = - Then '如果原始的图像是24位,则这个函数会调用系统的调色板来将图像转换为8位,转换的效果会不尽人意,但也有可能系统不自动转换,保存失败
- SaveStdPicToFile = (GdipSaveImageToFile(Bitmap, StrPtr(FileName), CLSID(), ByVal ) = )
- End If
- End Select
- End If
- GdipDisposeImage Bitmap '注意释放资源
- GdiplusShutdown Token '关闭GDI+。
- End Function
- Private Function GetEncoderClsID(strMimeType As String, ClassID() As Long) As Long
- Dim Num As Long
- Dim Size As Long
- Dim I As Long
- Dim Info() As ImageCodecInfo
- Dim Buffer() As Byte
- GetEncoderClsID = -
- GdipGetImageEncodersSize Num, Size '得到解码器数组的大小
- If Size <> Then
- ReDim Info( To Num) As ImageCodecInfo '给数组动态分配内存
- ReDim Buffer( To Size) As Byte
- GdipGetImageEncoders Num, Size, Buffer() '得到数组和字符数据
- CopyMemory Info(), Buffer(), (Len(Info()) * Num) '复制类头
- For I = To Num '循环检测所有解码
- If (StrComp(PtrToStrW(Info(I).MimeType), strMimeType, vbTextCompare) = ) Then '必须把指针转换成可用的字符
- CopyMemory ClassID(), Info(I).ClassID(), '保存类的ID
- GetEncoderClsID = I '返回成功的索引值
- Exit For
- End If
- Next
- End If
- End Function
- Private Function PtrToStrW(ByVal lpsz As Long) As String
- Dim Out As String
- Dim Length As Long
- Length = lstrlenW(lpsz)
- If Length > Then
- Out = StrConv(String$(Length, vbNullChar), vbUnicode)
- CopyMemory ByVal Out, ByVal lpsz, Length *
- PtrToStrW = StrConv(Out, vbFromUnicode)
- End If
- End Function
GDI+_SavePic的更多相关文章
- 超全面的.NET GDI+图形图像编程教程
本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...
- (转载)GDI+双缓冲
双缓冲在GDI+里可以有效的提高描画效率.改善显示的质量. 下面的代码是一个最简单的双缓冲的模板.可以根据需要,做简单的修改即可. Bitmap CacheImage( [Width], [Heigh ...
- (转载)解决GDI闪烁
一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁. 先来谈谈闪烁产生的原因 原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的 ...
- 通过GDI+绘制 验证码
只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...
- 【VC++技术杂谈007】使用GDI+进行图片格式转换
本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...
- C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- GDI+ 笔记
1.GDI+模板 #include<windows.h> #include<GdiPlus.h> #include <time.h> #include <ma ...
- C# GDI+发生一般性错误(A generic error occurred in GDI+))
解决思路: 1. 因为 .net GDI+ 是对底层 的封装. 所以可以尝试用 Marshal.GetLastWin32Error();函数获得底层错误代码. try{ image.Save(file ...
随机推荐
- 自动化测试-19.selenium定位之通过JS修改html写入日期数据以及从文本读取数据实战
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.support.select import ...
- Day 2: ASP.NET and python trying
ASP.NET and Python/Javascript Many jQuery plugins that are designed and shared for free on the inter ...
- jquery绑定回车事件
//回车事件绑定 $(".left-content").keyup(function(event){ var theEvent = event || window.event; v ...
- Hello2 分析
一.打开GreetingServlet.java文件以查看它 hello2应用程序是一个web模块,hello2应用程序的行为几乎与hello1应用程序相同,但是它是使用Java Servlet技术实 ...
- ios-上传图片到后台
做第一个项目时,有个版块的个人信息的编辑涉及到头像修改,老大说项目里有通用的代码,让我自己去找.总算找到,搞了许久才弄好,看来理解能力还需要提高啊!! #pragma mark- 修改头像上传后保存 ...
- POI导出Execl文件,使JAVA虚拟机OOM
由于在项目中使用POI导出execl,导致JAVA虚拟机OOM,采用以下方式解决问题: 原先方式: g_wb = new XSSFWorkbook(sourceFile.getInputStream( ...
- 18.3 #define DM9000_DBG(fmt,args...) printf(fmt, ##args)代表什么
标准C支持可变参数的函数,意味着函数的参数是不固定的,例如printf()函数的原型为:int printf( const char *format [, argument]... ) 而在GNU C ...
- 百度网盘提交提取密码:根据cookies获取loginId 的js
java下载百度网盘中资料,发现网上都只有关于公开分享的实现,没有关于私有分享的实现,抓包发现有一个关键参数:logid url:https://pan.baidu.com/share/verify? ...
- redux & react-redux
在vue中,可以使用vuex进行数据管理,在react中,可以使用redux进行数据管理.redux主要由Store.Reducer和Action组成: Store:状态载体,访问状态.提交状态.监听 ...
- vm虚拟机 模板机进行克隆导致centos 7.2 无法加载网卡
问题描述:vm虚拟机 模板机进行克隆导致centos 7.2 无法加载网卡. 1.ifconfig 查看网卡状态 lo: flags=<UP,LOOPBACK,RUNNING> mtu i ...