C#将图像转换为完全黑色&;白色

本文关键字:黑色 amp 白色 图像 转换 | 更新日期: 2023-09-27 17:57:46

我有一张gif图片,太大了,无法满足我的需求(即使是100~300kb)

在photoshop中,我通过将他使用的颜色数量减少到2种(黑色和白色),成功地将我的160kb gif变成了15kb(他的尺寸的1/10!!)。

我想在我的应用程序中做同样的事情,但我所能找到的只是将图像转换为灰度,这将我的160kb gif转换为100kb。

有没有办法把我的gif变成完整的黑白?任何其他可以将gif缩小到更小大小的方式都将受到赞赏。

C#将图像转换为完全黑色&;白色

下面是一个代码项目示例,说明如何将其转换为二进制G4压缩TIFF。请注意,这对于有大量空白和文本的图像来说非常好,但对于图像来说就不那么好了。对于图像,您可能希望看到另一个答案并使用抖动。

这里有一些关于SO:Bayer有序抖音的代码,我认为它应该做到这一点(没有经过测试)。值得一试。

您可以使用ImageMagick。通过Process.Start通过命令行运行它,或者使用作为Windows安装一部分的COM接口。选项"单色"是你的朋友。

在C#中将图像转换为黑白

/*
Copyright (c) 2010 <a href="http://www.gutgames.com">James Craig</a>
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
#region Usings
using System.Drawing;
using System.Drawing.Imaging;
#endregion
 namespace Utilities.Media.Image
 {
    /// <summary>
    /// Helper class for setting up and applying a color matrix
     /// </summary>
     public class ColorMatrix
    {
         #region Constructor
        /// <summary>
        /// Constructor
         /// </summary>
         public ColorMatrix()
         {
       }
         #endregion
           #region Properties
         /// <summary>
         /// Matrix containing the values of the ColorMatrix
         /// </summary>
         public float[][] Matrix { get; set; }
         #endregion
         #region Public Functions
         /// <summary>
         /// Applies the color matrix
         /// </summary>
         /// <param name="OriginalImage">Image sent in</param>
         /// <returns>An image with the color matrix applied</returns>
        public Bitmap Apply(Bitmap OriginalImage)
         {
             using (Graphics NewGraphics = Graphics.FromImage(NewBitmap))
             {
                 System.Drawing.Imaging.ColorMatrix NewColorMatrix = new System.Drawing.Imaging.ColorMatrix(Matrix);
                 using (ImageAttributes Attributes = new ImageAttributes())
                {
                     Attributes.SetColorMatrix(NewColorMatrix);
                     NewGraphics.DrawImage(OriginalImage,
                         new System.Drawing.Rectangle(0, 0, OriginalImage.Width, OriginalImage.Height),
                         0, 0, OriginalImage.Width, OriginalImage.Height,
                         GraphicsUnit.Pixel,
                         Attributes);
                 }
             }
             return NewBitmap;
         }
         #endregion
     }
 }

 /// <summary>
/// Converts an image to black and white
/// </summary>
/// <param name="Image">Image to change</param>
/// <returns>A bitmap object of the black and white image</returns>
public static Bitmap ConvertBlackAndWhite(Bitmap Image)
{
     ColorMatrix TempMatrix = new ColorMatrix();
    TempMatrix.Matrix = new float[][]{
                     new float[] {.3f, .3f, .3f, 0, 0},
                    new float[] {.59f, .59f, .59f, 0, 0},
                     new float[] {.11f, .11f, .11f, 0, 0},
                    new float[] {0, 0, 0, 1, 0},
                    new float[] {0, 0, 0, 0, 1}
                };
     return TempMatrix.Apply(Image);
}
 float[][] FloatColorMatrix ={ 
         new float[] {1, 0, 0, 0, 0}, 
         new float[] {0, 1, 0, 0, 0}, 
        new float[] {0, 0, 1, 0, 0}, 
        new float[] {0, 0, 0, 1, 0}, 
         new float[] {0, 0, 0, 0, 1} 
     };

查看Floyd Steinberg抖动:http://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering

或者,如果你不需要抖动,可以找到平均亮度,并将高于该亮度的所有像素变为白色,低于该亮度的像素变为黑色。

Chuck Conway 发布的解决方案的工作版本
 /*
Copyright (c) 2010 <a href="http://www.gutgames.com">James Craig</a>
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/
using System.Drawing;
using System.Drawing.Imaging;
namespace WebCamService {
    class ColorMatrix {
        public float[][] Matrix { get; set; }
        public Bitmap Apply(Bitmap OriginalImage) {
            using (Graphics NewGraphics = Graphics.FromImage(OriginalImage)) {
                System.Drawing.Imaging.ColorMatrix NewColorMatrix = new System.Drawing.Imaging.ColorMatrix(Matrix);
                using (ImageAttributes Attributes = new ImageAttributes()) {
                    Attributes.SetColorMatrix(NewColorMatrix);
                    NewGraphics.DrawImage(OriginalImage,
                        new System.Drawing.Rectangle(0, 0, OriginalImage.Width, OriginalImage.Height),
                        0, 0, OriginalImage.Width, OriginalImage.Height,
                        GraphicsUnit.Pixel,
                        Attributes);
                }
            }
            return OriginalImage;
        }
        public static Bitmap ConvertBlackAndWhite(Bitmap Image) {
            ColorMatrix TempMatrix = new ColorMatrix();
            TempMatrix.Matrix = new float[][]{
                     new float[] {.3f, .3f, .3f, 0, 0},
                    new float[] {.59f, .59f, .59f, 0, 0},
                     new float[] {.11f, .11f, .11f, 0, 0},
                    new float[] {0, 0, 0, 1, 0},
                    new float[] {0, 0, 0, 0, 1}
                };
            return TempMatrix.Apply(Image);
        }

    }
}