2010-02-11 70 views
3

我在圖像上設置了版權。之後,我需要刪除舊文件。但我不能因爲它很忙。 我需要將版權保護的文件從「copyrighted _」+ imageFile重命名爲imageFile文件正忙。我無法刪除它

public static void SetImageCopyright(string imageFile) 
     { 
      #region 
      //create a image object containing the photograph to watermark 
      Image imgPhoto = Image.FromFile(imageFile); 
      int phWidth = imgPhoto.Width; 
      int phHeight = imgPhoto.Height; 

      //create a Bitmap the Size of the original photograph 
      Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb); 

      bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); 

      //load the Bitmap into a Graphics object 
      Graphics grPhoto = Graphics.FromImage(bmPhoto); 


      //------------------------------------------------------------ 
      //Step #1 - Insert Copyright message 
      //------------------------------------------------------------ 

      //Set the rendering quality for this Graphics object 
      grPhoto.SmoothingMode = SmoothingMode.AntiAlias; 

      //Draws the photo Image object at original size to the graphics object. 
      grPhoto.DrawImage(
       imgPhoto,        // Photo Image object 
       new Rectangle(0, 0, phWidth, phHeight), // Rectangle structure 
       0,          // x-coordinate of the portion of the source image to draw. 
       0,          // y-coordinate of the portion of the source image to draw. 
       phWidth,        // Width of the portion of the source image to draw. 
       phHeight,        // Height of the portion of the source image to draw. 
       GraphicsUnit.Pixel);     // Units of measure 

      //------------------------------------------------------- 
      //to maximize the size of the Copyright message we will 
      //test multiple Font sizes to determine the largest posible 
      //font we can use for the width of the Photograph 
      //define an array of point sizes you would like to consider as possiblities 
      //------------------------------------------------------- 
      int[] sizes = new int[] { 25, 16, 12, 10, 8, 6, 4 }; 

      Font crFont = null; 
      SizeF crSize = new SizeF(); 

      //Loop through the defined sizes checking the length of the Copyright string 
      //If its length in pixles is less then the image width choose this Font size. 
      for (int i = 0; i < 7; i++) 
      { 
       //set a Font object to Arial (i)pt, Bold 
       crFont = new Font("arial", sizes[i], FontStyle.Bold); 
       //Measure the Copyright string in this Font 
       crSize = grPhoto.MeasureString("AlexMaslakov.ru", crFont); 

       if ((ushort)crSize.Width < (ushort)phWidth) 
        break; 
      } 

      //Since all photographs will have varying heights, determine a 
      //position 5% from the bottom of the image 
      int yPixlesFromBottom = (int)(phHeight * .05); 

      //Now that we have a point size use the Copyrights string height 
      //to determine a y-coordinate to draw the string of the photograph 
      float yPosFromBottom = ((phHeight - yPixlesFromBottom) - (crSize.Height/2)); 

      //Determine its x-coordinate by calculating the center of the width of the image 
      float xCenterOfImg = (phWidth/2); 

      //Define the text layout by setting the text alignment to centered 
      StringFormat StrFormat = new StringFormat(); 
      StrFormat.Alignment = StringAlignment.Center; 

      //define a Brush which is semi trasparent black (Alpha set to 153) 
      SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0)); 

      //Draw the Copyright string 
      //grPhoto.DrawString(Copyright,     //string of text 
      // crFont,         //font 
      // semiTransBrush2,       //Brush 
      // new PointF(xCenterOfImg + 5, yPosFromBottom + 5), //Position 
      // StrFormat); 

      //define a Brush which is semi trasparent white (Alpha set to 153) 
      SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255)); 

      //Draw the Copyright string a second time to create a shadow effect 
      //Make sure to move this text 1 pixel to the right and down 1 pixel 
      grPhoto.DrawString("AlexMaslakov.ru",     //string of text 
       crFont,         //font 
       semiTransBrush,       //Brush 
       new PointF(xCenterOfImg, yPosFromBottom), //Position 
       StrFormat);        //Text alignment 



      //------------------------------------------------------------ 
      //Step #2 - Insert Watermark image 
      //------------------------------------------------------------ 

      //Create a Bitmap based on the previously modified photograph Bitmap 
      Bitmap bmWatermark = new Bitmap(bmPhoto); 
      bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); 
      //Load this Bitmap into a new Graphic Object 
      Graphics grWatermark = Graphics.FromImage(bmWatermark); 

      //To achieve a transulcent watermark we will apply (2) color 
      //manipulations by defineing a ImageAttributes object and 
      //seting (2) of its properties. 
      ImageAttributes imageAttributes = new ImageAttributes(); 

      //The first step in manipulating the watermark image is to replace 
      //the background color with one that is trasparent (Alpha=0, R=0, G=0, B=0) 
      //to do this we will use a Colormap and use this to define a RemapTable 
      ColorMap colorMap = new ColorMap(); 

      //My watermark was defined with a background of 100% Green this will 
      //be the color we search for and replace with transparency 
      colorMap.OldColor = Color.FromArgb(255, 0, 255, 0); 
      colorMap.NewColor = Color.FromArgb(0, 0, 0, 0); 

      ColorMap[] remapTable = { colorMap }; 

      imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap); 

      //The second color manipulation is used to change the opacity of the 
      //watermark. This is done by applying a 5x5 matrix that contains the 
      //coordinates for the RGBA space. By setting the 3rd row and 3rd column 
      //to 0.3f we achive a level of opacity 
      float[][] colorMatrixElements = { 
               new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},  
               new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},   
               new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},   
               new float[] {0.0f, 0.0f, 0.0f, 0.3f, 0.0f},   
               new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}}; 
      ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements); 

      imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, 
       ColorAdjustType.Bitmap); 
      #endregion 

      //Replace the original photgraphs bitmap with the new Bitmap 
      imgPhoto = bmWatermark; 
      grPhoto.Dispose(); 
      grWatermark.Dispose(); 
      bmPhoto.Dispose(); 

      //save new image to file system. 
      imgPhoto.Save("copyrighted_"+imageFile, ImageFormat.Jpeg); 
      imgPhoto.Dispose(); 

     } 
+2

_minimal_ testcase怎麼樣?你有沒有試過在一個更小的程序中再現這個? – 2010-02-11 08:37:26

回答

5

當您使用Image.FromFile時,只要圖像對象存在,文件就會打開。您必須處理圖像,然後才能替換文件。

您加載的圖像永遠不會放置在代碼中,您只需用帶水印的圖像替換它的引用。棄置圖像之前丟棄圖像:

//Replace the original photgraphs bitmap with the new Bitmap 
imgPhoto.Dispose(); 
imgPhoto = bmWatermark; 

現在您可以保存圖像替換原始文件。

+0

好。它運作良好。 – 2010-02-11 09:14:04

4

您打開文件imgPhoto並試圖挽救它,而它仍然是開放的(它不設置)。 你可以做的是打開文件到MemoryStream並從流中創建一個Image。 之後,您可以通過覆蓋它保存到原始文件。

// Open the file here 
Image original = Image.FromFile(file); 

// Create a MemoryStream in which to save the image 
MemoryStream originalStream = new MemoryStream(); 

// Save the Image to the MemoryStream 
original.Save(originalStream, original.RawFormat); 

// Dispose the original image, so you can overwrite it later 
original.Dispose(); 

現在您可以使用Image.FromStream方法創建一個您可以操作的圖像。

+0

如果您想直接在加載的圖像上繪圖,那麼這是一種替代方法。目前代碼正在創建一個新的位圖來繪製,所以不需要。然而,我並沒有加載圖像並保存到MemoryStream,而是使用File.ReadAllBytes從文件中獲取數據並從中創建一個MemoryStream,它將使用較少的內存。 – Guffa 2010-02-11 09:38:43

0

我不是C#專家,但它看起來像你不處置的原始圖像,因爲臨近年底你只是重新分配變量:imgPhoto = bmWatermark;

嘗試使用新的變量,而不是resusing imgPhoto以及兩者的處理在刪除前結束。

0

文件不能「繁忙」,而是「鎖定」。

確保沒有其他應用程序保持您的文件處於打開狀態,並確保您在嘗試對該文件做更多事情之前,將所有文件句柄配置爲該文件。

如果找不到誰鎖定了文件,可以嘗試「進程管理器」。

+0

...或者Process Explorer的更專業的小弟弟'handle.exe' – 2010-02-11 08:40:39