2013-03-04 169 views
2

我想对RGBa .png文件进行一些自动化处理,并输出两个jpeg文件:1,它只是RGB通道,另一个就是alpha通道,作为灰度图像。将PNG拆分为RGB和Alpha通道

有没有办法在C#本身做到这一点?如果需要第三方库,只要它是免费/开放源代码就没有问题,但我宁愿直接使用GDI或其他软件。

+0

如何使用'ColorMatrix'用于获取灰度图像? – Magnus 2013-03-04 18:08:49

+0

示例代码请...我不知道该怎么做。 – 2013-03-04 18:12:27

回答

1

选项 - 加载到位图clone to get RGB only,手动grab bits with LockBits并提取alpha通道以从中创建新的灰度位图。

// get RGB copy 
var bitmapInRgbFormat = loadedBitmap.Clone(
     new Rectangle(0, 0, loadedBitmap.Width, loadedBitmap.Height), 
     PixelFormat.Format32bppRgb) 
3

这是我工作的代码:

/// <summary> 
    /// Split PNG file into two JPGs (RGB and alpha) 
    /// </summary> 
    private void SplitPngFileIntoRGBandAplha(string imagePath) 
    { 
     try 
     { 
      // Open original bitmap 
      var bitmap = new Bitmap(imagePath); 

      // Rectangle 
      var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); 

      // Get RGB bitmap 
      var bitmapInRgbFormat = bitmap.Clone(rect, PixelFormat.Format32bppRgb); 

      // Read bitmap data 
      BitmapData bmData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, bitmap.PixelFormat); 

      // Prepare alpha bitmap 
      var alphaBitmap = new Bitmap(bmData.Width, bmData.Height, PixelFormat.Format32bppRgb); 

      for (int y = 0; y <= bmData.Height -1; y++) 
      { 
       for (int x = 0; x <= bmData.Width -1; x++) 
       { 
        Color PixelColor = Color.FromArgb(Marshal.ReadInt32(bmData.Scan0, (bmData.Stride * y) + (4 * x))); 
        if (PixelColor.A > 0 & PixelColor.A <= 255) 
        { 
         alphaBitmap.SetPixel(x, y, Color.FromArgb(PixelColor.A, PixelColor.A, PixelColor.A, PixelColor.A)); 
        } 
        else 
        { 
         alphaBitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0)); 
        } 
       } 
      } 

      bitmap.UnlockBits(bmData); 

      // Prepare JPG format 
      ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg); 
      var encoder = Encoder.Quality; 
      var encoderParameters = new EncoderParameters(1); 
      var encoderParameter = new EncoderParameter(encoder, 100L); 
      encoderParameters.Param[0] = encoderParameter; 

      // Save RGB bitmap 
      bitmapInRgbFormat.Save(imagePath.Replace("png", "jpg"), jgpEncoder, encoderParameters); 

      // Save Alpha bitmpa 
      alphaBitmap.Save(imagePath.Replace(".png", "_alpha.jpg"), jgpEncoder, encoderParameters); 

      bitmap.Dispose(); 
      bitmapInRgbFormat.Dispose(); 
      bitmap.Dispose(); 

      // Delete bitmap 
      System.IO.File.Delete(imagePath); 
     } 
     catch(Exception e) 
     { 
      // Handle exception 
     } 

    }