ロック画面の画像(参考サイト#1を参照ください)をサムネイル表示して、欲しい画像だけ簡単にコピーできるようにしたいと思ったのでC#で作ってみた。
画面キャプチャ
使い方
画像を選んでデスクトップ(他のフォルダでも可)にドラッグ&ドロップすると、ファイルがコピーされます。
コピー後の拡張子の変更(.jpgにしてください)は手動でお願いします。(一時ファイルを作るのが面倒なため)
ソースコード
usingSystem;usingSystem.Drawing;usingSystem.Drawing.Imaging;usingSystem.IO;usingSystem.Windows.Forms;classWinWallpaperPreview:Form{staticreadonlystringimageDir=GetDefaultWallpaperPath();staticstringGetDefaultWallpaperPath(){returnPath.Combine(Environment.GetEnvironmentVariable("LOCALAPPDATA"),@"Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets");}classImageItemInfo{publicstringFullPath{get;privateset;}publicSystem.Drawing.SizeSize{get;privateset;}publicintWidth{get{returnSize.Width;}}publicintHeight{get{returnSize.Height;}}publicImageItemInfo(stringfullPath,Sizesize){FullPath=fullPath;Size=size;}}// 幅w、高さhのImageオブジェクトを作成ImageCreateThumbnail(Imageimage,Sizesize){intw=size.Width;inth=size.Height;Bitmapcanvas=newBitmap(w,h);Graphicsg=Graphics.FromImage(canvas);g.FillRectangle(Brushes.LightGray,0,0,w,h);floatfw=(float)w/(float)image.Width;floatfh=(float)h/(float)image.Height;floatscale=Math.Min(fw,fh);fw=image.Width*scale;fh=image.Height*scale;g.DrawImage(image,(w-fw)/2,(h-fh)/2,fw,fh);g.Dispose();returncanvas;}voidLoadImage(){string[]files=Directory.GetFiles(imageDir);intcount=0;foreach(stringfilePathinfiles){Imageoriginal;try{original=Image.FromFile(filePath);// 拡張子がなくても自動判別してくれる}catch(Exceptionex){// かなり乱暴なのでマネしないように...Console.WriteLine(ex);Console.WriteLine("Ignored: "+Path.GetFileName(filePath));continue;}if(original==null){Console.WriteLine("Ignored: "+Path.GetFileName(filePath));continue;}Imagethumbnail=CreateThumbnail(original,imgList.ImageSize);imgList.Images.Add(thumbnail);stringtext=original.Size.Width.ToString()+" x "+original.Size.Height.ToString();lsv.Items.Add(text,count);// lsv.Items.Add(Path.GetFileName(filePath), count);lsv.Items[count].Tag=newImageItemInfo(filePath,original.Size);count++;original.Dispose();thumbnail.Dispose();}}//void Lsv_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)//{// Console.WriteLine(e.Action);//}voidLsv_ItemDrag(Objectsender,ItemDragEventArgse){varitem=(ListViewItem)(e.Item);stringpath=Path.Combine(imageDir,((ImageItemInfo)(item.Tag)).FullPath);//ドラッグ&ドロップ処理を開始するIDataObjectiData=newDataObject(DataFormats.FileDrop,newstring[]{path});lsv.DoDragDrop(iData,DragDropEffects.Copy);}/*
壁紙変更は下記でやれるらしい
[DllImport("User32.DLL")]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, string pvParam, uint fWinIni);
public static uint SPI_SETDESKWALLPAPER = 0x0014;
String sName = fullPath;
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, sName, 0);
*/ListViewlsv;ImageListimgList;//StatusStrip sts;WinWallpaperPreview(){intwidth=100;intheight=80;imgList=newImageList();imgList.ImageSize=newSize(width,height);lsv=newListView();lsv.View=View.Tile;lsv.LargeImageList=imgList;lsv.Dock=DockStyle.Fill;lsv.MultiSelect=false;//lsv.SelectedIndexChanged += ;lsv.ItemDrag+=Lsv_ItemDrag;//lsv.QueryContinueDrag += Lsv_QueryContinueDrag;Controls.Add(lsv);//sts = new StatusStrip();//Controls.Add(sts);Load+=(s,e)=>{LoadImage();};Text="Wallpaper Preview";ClientSize=newSize(700,500);}[STAThread]staticvoidMain(string[]args){Application.Run(newWinWallpaperPreview());}}