C#选择文件返回缩略图
传入文件路径,返回临时文件中缩略图的路径,jpg,pdf,office,rar都行
- string path = ThumbnailHelper.GetInstance().GetJPGThumbnail("D:\\1.jpg");
ThumbnailHelper
- public class Win32Helper
- {
- internal const string IShellItem2Guid = "7E9FB0D3-919F-4307-AB2E-9B1860310C93";
- [DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
- internal static extern int SHCreateItemFromParsingName(
- [MarshalAs(UnmanagedType.LPWStr)] string path,
- // The following parameter is not used - binding context.
- IntPtr pbc,
- ref Guid riid,
- [MarshalAs(UnmanagedType.Interface)] out IShellItem shellItem);
- [DllImport("gdi32.dll")]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool DeleteObject(IntPtr hObject);
- [ComImport]
- [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- [Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")]
- internal interface IShellItem
- {
- void BindToHandler(IntPtr pbc,
- [MarshalAs(UnmanagedType.LPStruct)]Guid bhid,
- [MarshalAs(UnmanagedType.LPStruct)]Guid riid,
- out IntPtr ppv);
- void GetParent(out IShellItem ppsi);
- void GetDisplayName(SIGDN sigdnName, out IntPtr ppszName);
- void GetAttributes(uint sfgaoMask, out uint psfgaoAttribs);
- void Compare(IShellItem psi, uint hint, out int piOrder);
- };
- public enum ThumbnailOptions : uint
- {
- None = ,
- ReturnOnlyIfCached = ,
- ResizeThumbnail = ,
- UseCurrentScale =
- }
- internal enum SIGDN : uint
- {
- NORMALDISPLAY = ,
- PARENTRELATIVEPARSING = 0x80018001,
- PARENTRELATIVEFORADDRESSBAR = 0x8001c001,
- DESKTOPABSOLUTEPARSING = 0x80028000,
- PARENTRELATIVEEDITING = 0x80031001,
- DESKTOPABSOLUTEEDITING = 0x8004c000,
- FILESYSPATH = 0x80058000,
- URL = 0x80068000
- }
- internal enum HResult
- {
- Ok = 0x0000,
- False = 0x0001,
- InvalidArguments = unchecked((int)0x80070057),
- OutOfMemory = unchecked((int)0x8007000E),
- NoInterface = unchecked((int)0x80004002),
- Fail = unchecked((int)0x80004005),
- ElementNotFound = unchecked((int)0x80070490),
- TypeElementNotFound = unchecked((int)0x8002802B),
- NoObject = unchecked((int)0x800401E5),
- Win32ErrorCanceled = ,
- Canceled = unchecked((int)0x800704C7),
- ResourceInUse = unchecked((int)0x800700AA),
- AccessDenied = unchecked((int)0x80030005)
- }
- [ComImportAttribute()]
- [GuidAttribute("bcc18b79-ba16-442f-80c4-8a59c30c463b")]
- [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
- internal interface IShellItemImageFactory
- {
- [PreserveSig]
- HResult GetImage(
- [In, MarshalAs(UnmanagedType.Struct)] NativeSize size,
- [In] ThumbnailOptions flags,
- [Out] out IntPtr phbm);
- }
- [StructLayout(LayoutKind.Sequential)]
- internal struct NativeSize
- {
- private int width;
- private int height;
- public int Width { set { width = value; } }
- public int Height { set { height = value; } }
- };
- [StructLayout(LayoutKind.Sequential)]
- public struct RGBQUAD
- {
- public byte rgbBlue;
- public byte rgbGreen;
- public byte rgbRed;
- public byte rgbReserved;
- }
- }
- public class ThumbnailHelper
- {
- #region instance
- private static object ooo = new object();
- private static ThumbnailHelper _ThumbnailHelper;
- private ThumbnailHelper() { }
- public static ThumbnailHelper GetInstance()
- {
- if (_ThumbnailHelper == null)
- {
- lock (ooo)
- {
- if (_ThumbnailHelper == null)
- _ThumbnailHelper = new ThumbnailHelper();
- }
- }
- return _ThumbnailHelper;
- }
- #endregion
- #region public methods
- public string GetJPGThumbnail(string filename, int width = , int height = , Win32Helper.ThumbnailOptions options = Win32Helper.ThumbnailOptions.None)
- {
- if (!File.Exists(filename))
- return string.Empty;
- Bitmap bit = GetBitmapThumbnail(filename, width, height, options);
- if (bit == null)
- return string.Empty;
- return GetThumbnailFilePath(bit);
- }
- #endregion
- #region private methods
- private Bitmap GetBitmapThumbnail(string fileName, int width = , int height = , Win32Helper.ThumbnailOptions options = Win32Helper.ThumbnailOptions.None)
- {
- IntPtr hBitmap = GetHBitmap(System.IO.Path.GetFullPath(fileName), width, height, options);
- try
- {
- Bitmap bmp = Bitmap.FromHbitmap(hBitmap);
- if (Bitmap.GetPixelFormatSize(bmp.PixelFormat) < )
- return bmp;
- return CreateAlphaBitmap(bmp, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
- }
- finally
- {
- // delete HBitmap to avoid memory leaks
- Win32Helper.DeleteObject(hBitmap);
- }
- }
- private Bitmap CreateAlphaBitmap(Bitmap srcBitmap, System.Drawing.Imaging.PixelFormat targetPixelFormat)
- {
- Bitmap result = new Bitmap(srcBitmap.Width, srcBitmap.Height, targetPixelFormat);
- System.Drawing.Rectangle bmpBounds = new System.Drawing.Rectangle(, , srcBitmap.Width, srcBitmap.Height);
- BitmapData srcData = srcBitmap.LockBits(bmpBounds, ImageLockMode.ReadOnly, srcBitmap.PixelFormat);
- bool isAlplaBitmap = false;
- try
- {
- for (int y = ; y <= srcData.Height - ; y++)
- {
- for (int x = ; x <= srcData.Width - ; x++)
- {
- System.Drawing.Color pixelColor = System.Drawing.Color.FromArgb(
- Marshal.ReadInt32(srcData.Scan0, (srcData.Stride * y) + ( * x)));
- if (pixelColor.A > & pixelColor.A < )
- {
- isAlplaBitmap = true;
- }
- result.SetPixel(x, y, pixelColor);
- }
- }
- }
- finally
- {
- srcBitmap.UnlockBits(srcData);
- }
- if (isAlplaBitmap)
- {
- return result;
- }
- else
- {
- return srcBitmap;
- }
- }
- private IntPtr GetHBitmap(string fileName, int width, int height, Win32Helper.ThumbnailOptions options)
- {
- Win32Helper.IShellItem nativeShellItem;
- Guid shellItem2Guid = new Guid(Win32Helper.IShellItem2Guid);
- int retCode = Win32Helper.SHCreateItemFromParsingName(fileName, IntPtr.Zero, ref shellItem2Guid, out nativeShellItem);
- if (retCode != )
- throw Marshal.GetExceptionForHR(retCode);
- Win32Helper.NativeSize nativeSize = new Win32Helper.NativeSize();
- nativeSize.Width = width;
- nativeSize.Height = height;
- IntPtr hBitmap;
- Win32Helper.HResult hr = ((Win32Helper.IShellItemImageFactory)nativeShellItem).GetImage(nativeSize, options, out hBitmap);
- Marshal.ReleaseComObject(nativeShellItem);
- if (hr == Win32Helper.HResult.Ok) return hBitmap;
- throw Marshal.GetExceptionForHR((int)hr);
- }
- /// <summary>
- /// 获取临时文件
- /// </summary>
- /// <returns></returns>
- private FileStream GetTemporaryFilePath(ref string filePath)
- {
- string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName());
- var index = path.IndexOf('.');
- string temp = path.Substring(, index) + ".li";
- var fileStream = File.Create(temp);
- filePath = temp;
- return fileStream;
- }
- /// <summary>
- /// 参数
- /// </summary>
- /// <param name="mimeType"></param>
- /// <returns></returns>
- private ImageCodecInfo GetEncoderInfo(String mimeType)
- {
- int j;
- ImageCodecInfo[] encoders;
- encoders = ImageCodecInfo.GetImageEncoders();
- for (j = ; j < encoders.Length; ++j)
- {
- if (encoders[j].MimeType == mimeType)
- return encoders[j];
- }
- return null;
- }
- const int ExpectHeight = ;
- const int ExpectWidth = ;
- /// <summary>
- /// 得到图片缩放后的大小 图片大小过小不考虑缩放了
- /// </summary>
- /// <param name="originSize">原始大小</param>
- /// <returns>改变后大小</returns>
- private System.Drawing.Size ScalePhoto(System.Drawing.Size originSize, bool can)
- {
- if (originSize.Height * originSize.Width < ExpectHeight * ExpectWidth)
- {
- can = false;
- }
- if (can)
- {
- bool isportrait = false;
- if (originSize.Width <= originSize.Height)
- {
- isportrait = true;
- }
- if (isportrait)
- {
- double ratio = (double)ExpectHeight / (double)originSize.Height;
- return new System.Drawing.Size((int)(originSize.Width * ratio), (int)(originSize.Height * ratio));
- }
- else
- {
- double ratio = (double)ExpectWidth / (double)originSize.Width;
- return new System.Drawing.Size((int)(originSize.Width * ratio), (int)(originSize.Height * ratio));
- }
- }
- else
- {
- return new System.Drawing.Size(originSize.Width, originSize.Height);
- }
- }
- /// <summary>
- /// 获取缩略图文件
- /// </summary>
- /// <param name="BitmapIcon">缩略图</param>
- /// <returns>路径</returns>
- private string GetThumbnailFilePath(Bitmap bitmap)
- {
- var filePath = "";
- var fileStream = GetTemporaryFilePath(ref filePath);
- //bitmap.Save(filePath);
- ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg"); //image code info 图形图像解码压缩
- System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
- EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 100L);
- EncoderParameters encoderParameters = new EncoderParameters { Param = new EncoderParameter[] { myEncoderParameter } };
- var sizeScaled = ScalePhoto(bitmap.Size, true);
- //去黑色背景
- var finalBitmap = ClearBlackBackground(bitmap);
- finalBitmap.Save(fileStream, myImageCodecInfo, encoderParameters);
- fileStream.Dispose();
- return filePath;
- }
- private Bitmap ClearBlackBackground(Bitmap originBitmap)
- {
- using (var tempBitmap = new Bitmap(originBitmap.Width, originBitmap.Height))
- {
- tempBitmap.SetResolution(originBitmap.HorizontalResolution, originBitmap.VerticalResolution);
- using (var g = Graphics.FromImage(tempBitmap))
- {
- g.Clear(System.Drawing.Color.White);
- g.DrawImageUnscaled(originBitmap, , );
- }
- return new Bitmap(tempBitmap);
- }
- }
- #endregion
- }
C#选择文件返回缩略图的更多相关文章
- 使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件
使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件 原来的写法: <input type="file" accept="image/x-png ...
- 获取文件的缩略图Thumbnail和通过 AQS - Advanced Query Syntax 搜索本地文件
演示如何获取文件的缩略图 FileSystem/ThumbnailAccess.xaml <Page x:Class="XamlDemo.FileSystem.ThumbnailAcc ...
- android 中获取视频文件的缩略图(非原创)
在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...
- VC中打开对话框选择文件和文件夹
1.选择文件 CFileDialogdlg(true, NULL, NULL, NULL, "所有文件 | *.*", this); ...
- 琐碎--选择文件夹(路径)+生产txt格式的log+数据库操作方式
记录日常工作常用到的一些方法: 1 选择文件操作,并将文件的路径记录下来: OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = f ...
- Java按位置解析文本文件(使用Swing选择文件)
工作中遇到这样的一个需求,按位置解析一些文本文件,它们由头部.详情.尾部组成,并且每一行的长度可能不一样,每一行代表的意思也可能不一样,但是每一行各个位置代表的含义已经确定了. 例如有下面这样一段文本 ...
- Jquery调用从ashx文件返回的jsonp格式的数据处理实例
开发环境:vs2010+jquery-1.4.min.js 解决问题:网上代码比较少,好多调试不通,返回数据不用json而用jsonp主要考虑解决跨域问题 开发步骤:打开VS2010,新建一web站点 ...
- EXCEL VBA 选择文件对话框
Sub XXX() Dim arr() arr = Application.GetOpenFilename("所有支付文件 (*.xls;*.xlsx;*.csv),*.xls;*.xlsx ...
- windows API实现用户选择文件路径的对话框
在编写应用程序时,有时需要用户选择某个文件,以供应用程序使用,比如在某些管理程序中需要打开某一个进程,这个时候需要弹出一个对话框来将文件路径以树形图的形式表示出来,以图形化的方式供用户选择文件路径,而 ...
随机推荐
- tensorflow的变量作用域
一.由来 深度学习中需要使用大量的变量集,以往写代码我们只需要做全局限量就可以了,但在tensorflow中,这样做既不方便管理变量集,有不便于封装,因此tensorflow提供了一种变量管理方法:变 ...
- 一个优雅的图片裁剪插件vue-cropper
github: https://github.com/xyxiao001/vue-cropper
- 8.Python标识符命名规范
简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量.函数.类.模块以及其他对象的名称. Python 中标识符的命名不是随意的,而是要遵守一定的命令规则,比如 ...
- hibernate一对一单项关联映射
一.主键关联 1.两个实体对象的主键一样,以表明它们之间的一一对应关系: 2.不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值. Pe ...
- @清晰掉 qsort()
qsort函数描述: http://www.cnblogs.com/sooner/archive/2012/04/18/2455011.html qsort()函数实现: /*** *qsort.c ...
- SpringMvc中ModelAndView模型的应用
/** * 目标方法的返回值可以是 ModelAndView 类型. * 其中可以包含视图和模型信息 * SpringMVC 会把 ModelAndView 的 model 中数据放入到 reques ...
- nginx请求转发配置
以下为无ssl证书配置的请求转发 server { listen ; server_name api.****.com; #以下为指定请求域名匹配到某一个端口 #location ~* /union ...
- Openstack_单元测试工具 tox
目录 目录 扩展阅读 Openstack 的单元测试工具 单元测试工具使用流程 tox toxini 参考文章 扩展阅读 Python Mock的入门 Openstack 的单元测试工具 unitte ...
- Gradle之Gradle 源码分析(四)
Gradle 的启动 constructTaskGraph runTasks finishBuild gradle 脚本如何编译和执 插件调用流程 一.Gradle 的启动 1.1 整体实现图 1.2 ...
- linux防火墙iptables简单介绍
--append -A chain Append to chain --delete -D chain Delete matching rule from chain ...