65.9K
CodeProject 正在变化。 阅读更多。
Home

简单的照片发布程序

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.42/5 (6投票s)

2004年11月20日

2分钟阅读

viewsIcon

45498

downloadIcon

1402

这个程序展示了一个如何操作大量文件来转换它们的大小、质量并获取缩略图的示例。

引言

图片发布器可以转换大小、名称、压缩图片(.bmp.gif.jpg)并生成预览图像(如网络相册)。这里展示了简单的线程使用。你可以在 Guidomarche.NET 找到更新。这是一个非常简单的程序,用于同时转换许多图形文件。SinglePhoto.cs 包含一个类,用于收集有关每个要处理的照片的信息,例如原始路径、大小、压缩、新路径、大小和压缩。它存储有关新图片属性的信息。只有在保存图片时才会创建新图片。

  private int quality;
  private string FullSizePath;
  private string PreviewPathOut;
  private string FullSizePathOut;
  private bool AllocatedL; 
  private System.Drawing.Size FS; //full size
  private System.Drawing.Size PS; //preview

当关联的图像需要处理或显示时,图像将使用以下代码在内存中分配

public bool Allocate()
  {
   System.Drawing.Image.GetThumbnailImageAbort myCallBack = 
    new System.Drawing.Image.GetThumbnailImageAbort(PreviewFail);
   
   try
   { 
    this.FullSize=new Bitmap(FullSizePath);
    this.Preview=this.FullSize.GetThumbnailImage(PS.Width,
                               PS.Height,myCallBack,IntPtr.Zero);
    
    this.AllocatedL=true;
    
    
    
   }
   catch
   {
    return false;
   }
   return true;
  }

现在,SinglePhoto 对象包含一个全尺寸图像(原始图像)和一个预览图像。myCallBack 类似于一个委托,用于处理 GetThumbnailImage 方法中的失败。使用 SinglePhotoFHeightFWidthPHeightPWidthFSSizePSSize 属性,或者使用 ResizeFS(int alt, int larg)ResizePS(int alt, int larg),你可以设置图片的大小,并使用 FsImgPrvImg 属性获取调整大小后的图片。

自动化任务区域包含几种生成照片名称序列的方法。我想对 StartLoad()StartSave() 说几句:我决定在单独的线程中加载和保存图片,以避免图形界面“冻结”。一个好的想法是使用不同的线程来转换和保存每张图片,以加快操作速度。但我不太确定它是否真的会更快。运行线程非常简单,这展示了如何运行一个线程

private void StartLoad()
  {
     ThreadStart LoadingThreadDelegate=new ThreadStart(this.LoadTasks);
     Thread LoadingThread= new Thread(LoadingThreadDelegate);
     LoadingThread.Name="LoadingThread";
     LoadingThread.Start();
  }

你所要做的就是创建一个 ThreadStart 对象,链接到你希望在线程启动时启动的方法。在这个例子中,我创建了 LoadingThreadDelegate=new ThreadStart(this.LoadTasks),一个链接到 this.LoadTasks()ThreadStart 对象。然后你可以使用 ThreadStart 对象(命名为 LoadingThreadDelegate)来创建一个新的 Thread 对象,然后启动它。在执行 LoadingThread.Start() 之后,方法 LoadTasks() 和主线程(用户界面)将并发运行。

就这样了...

© . All rights reserved.