日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

毫秒级的时间处理上G的图片(生成缩略图)

發布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 毫秒级的时间处理上G的图片(生成缩略图) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

測試環境:

測試圖片(30M):

測試計時方法:

Stopwatch sw1 = new Stopwatch(); sw1.Start(); //TODO...... sw1.Stop(); string xx = sw1.ElapsedMilliseconds.ToString(); MessageBox.Show(xx);


方法一,(1張30M圖片,用時799毫秒)

public Image getThumbNailUsingGetThumbnailImage(string fileName) {Image img = Image.FromFile(fileName);return img.GetThumbnailImage(300, 300, null, IntPtr.Zero); }


方法二,(1張30M圖片,用時1329毫秒)

public Image createThumbnailUsingGDI(ref Image imgPhoto, int destWidth, int destHeight) {int sourceX = 0;int sourceY = 0;int destX = 0;int destY = 0;int sourceWidth = imgPhoto.Width;int sourceHeight = imgPhoto.Height;Bitmap b = new Bitmap(destWidth, destHeight);Graphics grPhoto = Graphics.FromImage(b);grPhoto.FillRectangle(Brushes.DarkGray, new Rectangle(destX, destY, destWidth, destHeight));grPhoto.DrawLine(new Pen(Brushes.LightGray), new Point(0, destHeight - 1), new Point(destWidth, destHeight - 1));grPhoto.DrawLine(new Pen(Brushes.LightGray), new Point(destWidth - 1, 0), new Point(destWidth - 1, destHeight));//shade rightgrPhoto.FillRectangle(Brushes.White, new Rectangle(destWidth - 3, 0, 7, 2));grPhoto.FillRectangle(Brushes.White, new Rectangle(destWidth - 2, 0, 7, 4));grPhoto.FillRectangle(Brushes.White, new Rectangle(destWidth - 1, 0, 7, 6));//shade bottongrPhoto.FillRectangle(Brushes.White, new Rectangle(0, destHeight - 3, 2, 7));grPhoto.FillRectangle(Brushes.White, new Rectangle(0, destHeight - 2, 4, 7));grPhoto.FillRectangle(Brushes.White, new Rectangle(0, destHeight - 1, 6, 7));grPhoto.DrawImage(imgPhoto, new Rectangle(destX + 2, destY + 2, destWidth - 7, destHeight - 7), new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel);grPhoto.Dispose();return b;}


方法三,(1張30M圖片,用時1636毫秒)

public Image getThumbNailWithFrame(string fileName) {FileStream fs = new FileStream(fileName, FileMode.Open);Image im = Image.FromStream(fs);Size szMax = new Size(300, 300);Size sz = getProportionalSize(szMax, im.Size);// superior image quality Bitmap bmpResized = new Bitmap(sz.Width, sz.Height);using (Graphics g = Graphics.FromImage(bmpResized)){g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.FillRectangle(Brushes.White, 0, 0, sz.Width, sz.Height);int FrameWidth = 5;//decides the frame border widthg.DrawRectangle(new Pen(Color.Silver, FrameWidth - 2), 0, 0, sz.Width - 1, sz.Height - 1);FrameWidth += 5;//decide the frame widthg.DrawImage(im, new Rectangle(FrameWidth, FrameWidth, sz.Width - FrameWidth * 2, sz.Height - FrameWidth * 2), new Rectangle(Point.Empty, im.Size), GraphicsUnit.Pixel);}im.Dispose(); im = null;fs.Close(); fs.Dispose(); fs = null;return bmpResized; }private Size getProportionalSize(Size szMax, Size szReal) {int nWidth;int nHeight;double sMaxRatio;double sRealRatio;if (szMax.Width < 1 || szMax.Height < 1 || szReal.Width < 1 || szReal.Height < 1)return Size.Empty;sMaxRatio = (double)szMax.Width / (double)szMax.Height;sRealRatio = (double)szReal.Width / (double)szReal.Height;if (sMaxRatio < sRealRatio){nWidth = Math.Min(szMax.Width, szReal.Width);nHeight = (int)Math.Round(nWidth / sRealRatio);}else{nHeight = Math.Min(szMax.Height, szReal.Height);nWidth = (int)Math.Round(nHeight * sRealRatio);}return new Size(nWidth, nHeight); }


方法四,(1張30M圖片,用時1664毫秒)

public Image getThumbNail(string fileName) {FileStream fs = new FileStream(fileName, FileMode.Open);Image im = Image.FromStream(fs);Size szMax = new Size(300, 300);Size sz = getProportionalSize(szMax, im.Size);// superior image quality Bitmap bmpResized = new Bitmap(sz.Width, sz.Height);using (Graphics g = Graphics.FromImage(bmpResized)){g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.DrawImage(im,new Rectangle(Point.Empty, sz),new Rectangle(Point.Empty, im.Size),GraphicsUnit.Pixel);}im.Dispose(); im = null;fs.Close(); fs.Dispose(); fs = null;return bmpResized; }private Size getProportionalSize(Size szMax, Size szReal) {int nWidth;int nHeight;double sMaxRatio;double sRealRatio;if (szMax.Width < 1 || szMax.Height < 1 || szReal.Width < 1 || szReal.Height < 1)return Size.Empty;sMaxRatio = (double)szMax.Width / (double)szMax.Height;sRealRatio = (double)szReal.Width / (double)szReal.Height;if (sMaxRatio < sRealRatio){nWidth = Math.Min(szMax.Width, szReal.Width);nHeight = (int)Math.Round(nWidth / sRealRatio);}else{nHeight = Math.Min(szMax.Height, szReal.Height);nWidth = (int)Math.Round(nHeight * sRealRatio);}return new Size(nWidth, nHeight); }


方法五,(1張30M圖片,用時735毫秒)

public Image createThumbFromProperty(string file) {Image image = new Bitmap(file);Image Thumb = null;PropertyItem[] propItems = image.PropertyItems;foreach (PropertyItem propItem in propItems){if (propItem.Id == 0x501B){byte[] imageBytes = propItem.Value;MemoryStream stream = new MemoryStream(imageBytes.Length);stream.Write(imageBytes, 0, imageBytes.Length);Thumb = Image.FromStream(stream);break;}}return Thumb; }


方法六,(50張30M圖片,237毫秒)

using System; using System.Diagnostics; using System.Drawing; using System.IO; using System.Runtime.InteropServices; using System.Text;//網址:https://www.experts-exchange.com/questions/21789724/How-to-create-thumbnail.html namespace 縮略圖查看 {public class ShellThumbnail : IDisposable{[Flags]private enum ESTRRET{STRRET_WSTR = 0,STRRET_OFFSET = 1,STRRET_CSTR = 2}[Flags]private enum ESHCONTF{SHCONTF_FOLDERS = 32,SHCONTF_NONFOLDERS = 64,SHCONTF_INCLUDEHIDDEN = 128,}[Flags]private enum ESHGDN{SHGDN_NORMAL = 0,SHGDN_INFOLDER = 1,SHGDN_FORADDRESSBAR = 16384,SHGDN_FORPARSING = 32768}[Flags]private enum ESFGAO{SFGAO_CANCOPY = 1,SFGAO_CANMOVE = 2,SFGAO_CANLINK = 4,SFGAO_CANRENAME = 16,SFGAO_CANDELETE = 32,SFGAO_HASPROPSHEET = 64,SFGAO_DROPTARGET = 256,SFGAO_CAPABILITYMASK = 375,SFGAO_LINK = 65536,SFGAO_SHARE = 131072,SFGAO_READONLY = 262144,SFGAO_GHOSTED = 524288,SFGAO_DISPLAYATTRMASK = 983040,SFGAO_FILESYSANCESTOR = 268435456,SFGAO_FOLDER = 536870912,SFGAO_FILESYSTEM = 1073741824,SFGAO_HASSUBFOLDER = -2147483648,SFGAO_CONTENTSMASK = -2147483648,SFGAO_VALIDATE = 16777216,SFGAO_REMOVABLE = 33554432,SFGAO_COMPRESSED = 67108864,}private enum EIEIFLAG{IEIFLAG_ASYNC = 1,IEIFLAG_CACHE = 2,IEIFLAG_ASPECT = 4,IEIFLAG_OFFLINE = 8,IEIFLAG_GLEAM = 16,IEIFLAG_SCREEN = 32,IEIFLAG_ORIGSIZE = 64,IEIFLAG_NOSTAMP = 128,IEIFLAG_NOBORDER = 256,IEIFLAG_QUALITY = 512}[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 0, CharSet = CharSet.Auto)]private struct STRRET_CSTR{public ESTRRET uType;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 520)]public byte[] cStr;}[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]private struct STRRET_ANY{[FieldOffset(0)]public ESTRRET uType;[FieldOffset(4)]public IntPtr pOLEString;}[StructLayoutAttribute(LayoutKind.Sequential)]private struct SIZE{public int cx;public int cy;}[ComImport(), Guid("00000000-0000-0000-C000-000000000046")][InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]private interface IUnknown{[PreserveSig()]IntPtr QueryInterface(ref Guid riid, ref IntPtr pVoid);[PreserveSig()]IntPtr AddRef();[PreserveSig()]IntPtr Release();}[ComImportAttribute()][GuidAttribute("00000002-0000-0000-C000-000000000046")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]private interface IMalloc{[PreserveSig()]IntPtr Alloc(int cb);[PreserveSig()]IntPtr Realloc(IntPtr pv, int cb);[PreserveSig()]void Free(IntPtr pv);[PreserveSig()]int GetSize(IntPtr pv);[PreserveSig()]int DidAlloc(IntPtr pv);[PreserveSig()]void HeapMinimize();}[ComImportAttribute()][GuidAttribute("000214F2-0000-0000-C000-000000000046")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]private interface IEnumIDList{[PreserveSig()]int Next(int celt, ref IntPtr rgelt, ref int pceltFetched);void Skip(int celt);void Reset();void Clone(ref IEnumIDList ppenum);}[ComImportAttribute()][GuidAttribute("000214E6-0000-0000-C000-000000000046")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]private interface IShellFolder{void ParseDisplayName(IntPtr hwndOwner, IntPtr pbcReserved,[MarshalAs(UnmanagedType.LPWStr)]string lpszDisplayName,ref int pchEaten, ref IntPtr ppidl, ref int pdwAttributes);void EnumObjects(IntPtr hwndOwner,[MarshalAs(UnmanagedType.U4)]ESHCONTF grfFlags,ref IEnumIDList ppenumIDList);void BindToObject(IntPtr pidl, IntPtr pbcReserved, ref Guid riid,ref IShellFolder ppvOut);void BindToStorage(IntPtr pidl, IntPtr pbcReserved, ref Guid riid, IntPtr ppvObj);[PreserveSig()]int CompareIDs(IntPtr lParam, IntPtr pidl1, IntPtr pidl2);void CreateViewObject(IntPtr hwndOwner, ref Guid riid,IntPtr ppvOut);void GetAttributesOf(int cidl, IntPtr apidl,[MarshalAs(UnmanagedType.U4)]ref ESFGAO rgfInOut);void GetUIObjectOf(IntPtr hwndOwner, int cidl, ref IntPtr apidl, ref Guid riid, ref int prgfInOut, ref IUnknown ppvOut);void GetDisplayNameOf(IntPtr pidl,[MarshalAs(UnmanagedType.U4)]ESHGDN uFlags,ref STRRET_CSTR lpName);void SetNameOf(IntPtr hwndOwner, IntPtr pidl,[MarshalAs(UnmanagedType.LPWStr)]string lpszName,[MarshalAs(UnmanagedType.U4)] ESHCONTF uFlags,ref IntPtr ppidlOut);}[ComImportAttribute(), GuidAttribute("BB2E617C-0920-11d1-9A0B-00C04FC2D6C1"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]private interface IExtractImage{void GetLocation([Out(), MarshalAs(UnmanagedType.LPWStr)]StringBuilder pszPathBuffer, int cch, ref int pdwPriority, ref SIZE prgSize, int dwRecClrDepth, ref int pdwFlags);void Extract(ref IntPtr phBmpThumbnail);}private class UnmanagedMethods{[DllImport("shell32", CharSet = CharSet.Auto)]internal extern static int SHGetMalloc(ref IMalloc ppMalloc);[DllImport("shell32", CharSet = CharSet.Auto)]internal extern static int SHGetDesktopFolder(ref IShellFolder ppshf);[DllImport("shell32", CharSet = CharSet.Auto)]internal extern static int SHGetPathFromIDList(IntPtr pidl, StringBuilder pszPath);[DllImport("gdi32", CharSet = CharSet.Auto)]internal extern static int DeleteObject(IntPtr hObject);}~ShellThumbnail(){Dispose();}private IMalloc alloc = null;private bool disposed = false;private Size _desiredSize = new Size(100, 100);private Bitmap _thumbNail;public Bitmap ThumbNail{get{return _thumbNail;}}public Size DesiredSize{get { return _desiredSize; }set { _desiredSize = value; }}private IMalloc Allocator{get{if (!disposed){if (alloc == null){UnmanagedMethods.SHGetMalloc(ref alloc);}}else{Debug.Assert(false, "Object has been disposed.");}return alloc;}}public Bitmap GetThumbnail(string fileName){if (string.IsNullOrEmpty(fileName))return null;if (!File.Exists(fileName) && !Directory.Exists(fileName)){throw new FileNotFoundException(string.Format("The file '{0}' does not exist", fileName), fileName);}if (_thumbNail != null){_thumbNail.Dispose();_thumbNail = null;}IShellFolder folder = null;try{folder = getDesktopFolder;}catch (Exception ex){throw ex;}if (folder != null){IntPtr pidlMain = IntPtr.Zero;try{int cParsed = 0;int pdwAttrib = 0;string filePath = Path.GetDirectoryName(fileName);folder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, filePath, ref cParsed, ref pidlMain, ref pdwAttrib);}catch (Exception ex){Marshal.ReleaseComObject(folder);throw ex;}if (pidlMain != IntPtr.Zero){Guid iidShellFolder = new Guid("000214E6-0000-0000-C000-000000000046");IShellFolder item = null;try{folder.BindToObject(pidlMain, IntPtr.Zero, ref iidShellFolder, ref item);}catch (Exception ex){Marshal.ReleaseComObject(folder);Allocator.Free(pidlMain);throw ex;}if (item != null){IEnumIDList idEnum = null;try{item.EnumObjects(IntPtr.Zero, (ESHCONTF.SHCONTF_FOLDERS | ESHCONTF.SHCONTF_NONFOLDERS), ref idEnum);}catch (Exception ex){Marshal.ReleaseComObject(folder);Allocator.Free(pidlMain);throw ex;}if (idEnum != null){int hRes = 0;IntPtr pidl = IntPtr.Zero;int fetched = 0;bool complete = false;while (!complete){hRes = idEnum.Next(1, ref pidl, ref fetched);if (hRes != 0){pidl = IntPtr.Zero;complete = true;}else{if (_getThumbNail(fileName, pidl, item)){complete = true;}}if (pidl != IntPtr.Zero){Allocator.Free(pidl);}}Marshal.ReleaseComObject(idEnum);}Marshal.ReleaseComObject(item);}Allocator.Free(pidlMain);}Marshal.ReleaseComObject(folder);}return ThumbNail;}private bool _getThumbNail(string file, IntPtr pidl, IShellFolder item){IntPtr hBmp = IntPtr.Zero;IExtractImage extractImage = null;try{string pidlPath = PathFromPidl(pidl);if (Path.GetFileName(pidlPath).ToUpper().Equals(Path.GetFileName(file).ToUpper())){IUnknown iunk = null;int prgf = 0;Guid iidExtractImage = new Guid("BB2E617C-0920-11d1-9A0B-00C04FC2D6C1");item.GetUIObjectOf(IntPtr.Zero, 1, ref pidl, ref iidExtractImage, ref prgf, ref iunk);extractImage = (IExtractImage)iunk;if (extractImage != null){Console.WriteLine("Got an IExtractImage object!");SIZE sz = new SIZE();sz.cx = DesiredSize.Width;sz.cy = DesiredSize.Height;StringBuilder location = new StringBuilder(260, 260);int priority = 0;int requestedColourDepth = 32;EIEIFLAG flags = EIEIFLAG.IEIFLAG_ASPECT | EIEIFLAG.IEIFLAG_SCREEN;int uFlags = (int)flags;try{extractImage.GetLocation(location, location.Capacity, ref priority, ref sz, requestedColourDepth, ref uFlags);extractImage.Extract(ref hBmp);}catch (System.Runtime.InteropServices.COMException ex){}if (hBmp != IntPtr.Zero){_thumbNail = Bitmap.FromHbitmap(hBmp);}Marshal.ReleaseComObject(extractImage);extractImage = null;}return true;}else{return false;}}catch (Exception ex){if (hBmp != IntPtr.Zero){UnmanagedMethods.DeleteObject(hBmp);}if (extractImage != null){Marshal.ReleaseComObject(extractImage);}throw ex;}}private string PathFromPidl(IntPtr pidl){StringBuilder path = new StringBuilder(260, 260);int result = UnmanagedMethods.SHGetPathFromIDList(pidl, path);if (result == 0){return string.Empty;}else{return path.ToString();}}private IShellFolder getDesktopFolder{get{IShellFolder ppshf = null;int r = UnmanagedMethods.SHGetDesktopFolder(ref ppshf);return ppshf;}}public void Dispose(){if (!disposed){if (alloc != null){Marshal.ReleaseComObject(alloc);}alloc = null;if (_thumbNail != null){_thumbNail.Dispose();}disposed = true;}}} } View Code


方法七,(50張30M圖片,96毫秒)

速度最快,只要兄弟們推薦的多,我下午公布源碼。^_^?

?

最快速度源碼,請接收

using System; using System.IO; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Drawing.Drawing2D;namespace 縮略圖查看 {/// <summary>/// Allows reading of embedded thumbnail image from the EXIF information in an image./// </summary>//public abstract class ExifThumbReaderpublic class ExifThumbReader{// GDI plus functions[DllImport("gdiplus.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]internal static extern int GdipGetPropertyItem(IntPtr image, int propid, int size, IntPtr buffer);[DllImport("gdiplus.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]internal static extern int GdipGetPropertyItemSize(IntPtr image, int propid, out int size);[DllImport("gdiplus.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]internal static extern int GdipLoadImageFromFile(string filename, out IntPtr image);[DllImport("gdiplus.dll", EntryPoint = "GdipDisposeImage", CharSet = CharSet.Unicode, ExactSpelling = true)]private static extern int GdipDisposeImage(IntPtr image);// EXIT tag value for thumbnail data. Value specified by EXIF standardprivate static int THUMBNAIL_DATA = 0x501B;/// <summary>/// Reads the thumbnail in the given image. If no thumbnail is found, returns null/// </summary>//public static Image ReadThumb(string imagePath)public Image ReadThumb(string imagePath){const int GDI_ERR_PROP_NOT_FOUND = 19; // Property not found errorconst int GDI_ERR_OUT_OF_MEMORY = 3;IntPtr hImage = IntPtr.Zero;IntPtr buffer = IntPtr.Zero; // Holds the thumbnail dataint ret;ret = GdipLoadImageFromFile(imagePath, out hImage);try{if (ret != 0)throw createException(ret);int propSize;ret = GdipGetPropertyItemSize(hImage, THUMBNAIL_DATA, out propSize);// Image has no thumbnail data in it. Return nullif (ret == GDI_ERR_PROP_NOT_FOUND)return null;if (ret != 0)throw createException(ret);// Allocate a buffer in memorybuffer = Marshal.AllocHGlobal(propSize);if (buffer == IntPtr.Zero)throw createException(GDI_ERR_OUT_OF_MEMORY);ret = GdipGetPropertyItem(hImage, THUMBNAIL_DATA, propSize, buffer);if (ret != 0)throw createException(ret);// buffer has the thumbnail data. Now we have to convert it to// an Imagereturn convertFromMemory(buffer);}finally{// Free the bufferif (buffer != IntPtr.Zero)Marshal.FreeHGlobal(buffer);GdipDisposeImage(hImage);}}/// <summary>/// Generates an exception depending on the GDI+ error codes (I removed some error/// codes)/// </summary>private static Exception createException(int gdipErrorCode){switch (gdipErrorCode){case 1:return new ExternalException("Gdiplus Generic Error", -2147467259);case 2:return new ArgumentException("Gdiplus Invalid Parameter");case 3:return new OutOfMemoryException("Gdiplus Out Of Memory");case 4:return new InvalidOperationException("Gdiplus Object Busy");case 5:return new OutOfMemoryException("Gdiplus Insufficient Buffer");case 7:return new ExternalException("Gdiplus Generic Error", -2147467259);case 8:return new InvalidOperationException("Gdiplus Wrong State");case 9:return new ExternalException("Gdiplus Aborted", -2147467260);case 10:return new FileNotFoundException("Gdiplus File Not Found");case 11:return new OverflowException("Gdiplus Over flow");case 12:return new ExternalException("Gdiplus Access Denied", -2147024891);case 13:return new ArgumentException("Gdiplus Unknown Image Format");case 18:return new ExternalException("Gdiplus Not Initialized", -2147467259);case 20:return new ArgumentException("Gdiplus Property Not Supported Error");}return new ExternalException("Gdiplus Unknown Error", -2147418113);}/// <summary>/// Converts the IntPtr buffer to a property item and then converts its /// value to a Drawing.Image item/// </summary>private static Image convertFromMemory(IntPtr thumbData){propertyItemInternal prop =(propertyItemInternal)Marshal.PtrToStructure(thumbData, typeof(propertyItemInternal));// The image data is in the form of a byte array. Write all // the bytes to a stream and create a new image from that streambyte[] imageBytes = prop.Value;MemoryStream stream = new MemoryStream(imageBytes.Length);stream.Write(imageBytes, 0, imageBytes.Length);return Image.FromStream(stream);}/// <summary>/// Used in Marshal.PtrToStructure()./// We need this dummy class because Imaging.PropertyItem is not a "blittable"/// class and Marshal.PtrToStructure only accepted blittable classes./// (It's not blitable because it uses a byte[] array and that's not a blittable/// type. See MSDN for a definition of Blittable.)/// </summary> [StructLayout(LayoutKind.Sequential)]private class propertyItemInternal{public int id = 0;public int len = 0;public short type = 0;public IntPtr value = IntPtr.Zero;public byte[] Value{get{byte[] bytes = new byte[(uint)len];Marshal.Copy(value, bytes, 0, len);return bytes;}}}} } View Code

?

測試結果:

方法圖片張數(張)每張大小(M)圖片總大小用時
方法一50301500M39950毫秒=40秒
方法二50301500M66450毫秒=66秒
方法三50301500M81800毫秒=81秒
方法四50301500M83200毫秒=83秒
方法五50301500M36750毫秒=37秒
方法六50301500M237毫秒
方法七50301500M96毫秒

總結

以上是生活随笔為你收集整理的毫秒级的时间处理上G的图片(生成缩略图)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。