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实现用户选择文件路径的对话框
在编写应用程序时,有时需要用户选择某个文件,以供应用程序使用,比如在某些管理程序中需要打开某一个进程,这个时候需要弹出一个对话框来将文件路径以树形图的形式表示出来,以图形化的方式供用户选择文件路径,而 ...
随机推荐
- pycharm如何添加固定代码块
1. file -- settings -- 搜索框输入live,找到 Live Templates 2. 选择你要添加到哪个语言中去,打开python组,并点击右上角 “+”,选择 1.Live T ...
- 【转】jqprint打印时自定义页眉页脚
需求:自定义页眉,实现打印时分页时每页页眉都显示相同的信息 打印所用插件jqprint 解决方法: <div class="divHeader"> <span s ...
- 1.8 全新日期api
/** * * @note * @author zhouyy <br> * Apr 14, 2017 5:21:12 PM * @version */ package com.bytter ...
- 一款新的好用的SSH工具——FinalShell,比XShell更牛逼~
FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求.特色功能:免费海外服务器远程桌面加速,ssh加速,双边tcp加速,内网穿 ...
- 流程控制 if else elif
[root@LV work]# [root@LV work]# vim name.py[root@LV work]# chmod +x name.py [root@LV work]# ./name.p ...
- GTX 1060 3GB 能否使用DeepFaceLab ?
大部分人都知道跑换脸软件对电脑配置的要求比较高.所以当你想要开始玩之前都会有一个疑问:我的电脑能跑起来了么?或者我的电脑能跑那个模型? 之前写过一篇750 1G显卡如何玩deepfakes的文章.今天 ...
- 看天猫EDM营销学企业EDM营销
众所周知,天猫EDM营销在业内算做的风生水起,相当不错.本文就由天猫EDM营销来教大家学做企业EDM营销. 1.邮件内容相对精美,并都带有天猫tmall各个栏目的链接,并且对于重点推出了的几个店铺给出 ...
- Selenium学习之==>常见面试题
转自:http://www.imdsx.cn/ 一.selenium中如何判断元素是否存在? expected_conditions模块提供了多种校验方式,我常用的一种是presence_of_ele ...
- Python学习之==>URL编码解码&if __name__ == '__main__'
一.URL编码解码 url的编码解码需要用到标准模块urllib中的parse方法 from urllib import parse url = 'http://www.baidu.com?query ...
- 中国MOOC_零基础学Java语言_第5周 数组_1多项式加法
第5周编程题 查看帮助 返回 第5周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...