【问题标题】:Create a PNG having JPG and AlphaChannel in C#在 C# 中创建具有 JPG 和 AlphaChannel 的 PNG
【发布时间】:2011-11-13 17:29:45
【问题描述】:

如果我有两个单独的 JPG 文件,其中包含图像和 Alpha 通道,我该如何创建一个 PNG 文件?

JPG 图片 + JPG Mask --> 透明的PNG

我已经尝试过 WPF 解决方案:

image.OpacityMask = new ImageBrush ( new BitmapImage ( uriMask ) );

和 System.Drawing。

Image bmpMask = Image.FromFile ( maskFilePath );
gfxNewImage.SetClip (  Graphics.FromImage (bmpMask) );

但我对两者都有问题(黑色背景或全黑)

有什么想法或例子吗?

谢谢你

【问题讨论】:

  • 如果不清楚,Mask.jpg 图像是具有白色到黑色值的图像。

标签: c# png jpeg mask alphablending


【解决方案1】:

好的,假设您有一个 JPEG Picute 和一个带有 Alpha Channel 的 Png 图片。 您应该这样做,并且仅当这 2 个图像大小相同时才会起作用。

Bitmap jpegFile = new Bitmap("JpegFile.jpg");
Bitmap alphaFile = new Bitmap("Png.jpg");

for(int i=0;i<jpegFile.Width;i++)
{
   for(int j=0;j<jpegFile.Height;j++)
    {
       Color withAlpha = jpegFile.GetPixel(i,j);
           withAlpha.A = alphaFile.GetPixel(i,j).A;
       jpegFile.SetPixel(withAlpha);
    }
}

【讨论】:

  • 好的,我试试。就我而言,我有 2 张 JPG,但我会选择灰度值作为 Alpha。谢谢。
  • @Mario Morales 这个算法有效,但是你在实现它时必须小心,因为如果你处理大量大图像,那么你应该找到一种方法如何多线程或者如果可能的话优化它.
  • 它有一些变化:你需要一个 32bpp 目标图像 Bitmap outImage = new Bitmap ( jpegFile.Width, jpegFile.Height, PixelFormat.Format32bppArgb ); 并创建一个颜色,因为 Color.A 不可写 Color withAlpha = Color.FromArgb ( alphaFile.GetPixel ( i, j ).R, jpegFile.GetPixel ( i, j ) );
  • 无论如何,我会寻找一种最有效的算法,因为它需要几秒钟来合并图像。谢谢
【解决方案2】:

试试这个 Grafics 对象的参数:

using (var g = Graphics.FromImage(bmpMask))
{
    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g.DrawImage(source, 0, 0, width, height);
}

【讨论】:

  • 它不起作用SmoothingModeInterpolationMode 与透明度无关。
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2021-09-03
  • 2020-10-22
  • 2020-01-02
相关资源
最近更新 更多