2
我想对RGBa .png文件进行一些自动化处理,并输出两个jpeg文件:1,它只是RGB通道,另一个就是alpha通道,作为灰度图像。将PNG拆分为RGB和Alpha通道
有没有办法在C#本身做到这一点?如果需要第三方库,只要它是免费/开放源代码就没有问题,但我宁愿直接使用GDI或其他软件。
我想对RGBa .png文件进行一些自动化处理,并输出两个jpeg文件:1,它只是RGB通道,另一个就是alpha通道,作为灰度图像。将PNG拆分为RGB和Alpha通道
有没有办法在C#本身做到这一点?如果需要第三方库,只要它是免费/开放源代码就没有问题,但我宁愿直接使用GDI或其他软件。
选项 - 加载到位图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)
这是我工作的代码:
/// <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
}
}
如何使用'ColorMatrix'用于获取灰度图像? – Magnus 2013-03-04 18:08:49
示例代码请...我不知道该怎么做。 – 2013-03-04 18:12:27