C#将图像转换为COMPLETE Black& White

时间:2011-05-27 17:43:17

标签: c# image-processing gif screen-capture

我有一张gif图片,对我的需求来说太大了(即使它是100~300kb)

在Photoshop中,我设法将我的160kb gif转换为15kb(其大小的1/10 !!),只需将他使用的颜色数量减少到2(黑白)。

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

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

6 个答案:

答案 0 :(得分:4)

以下是codeproject example如何将其转换为双色调G4压缩TIFF。请注意,这对于具有大量空白和文本的图像非常有用,但对于图像则不太好。对于图像,您可能希望看到另一个答案并使用抖动。

答案 1 :(得分:1)

SO上有一些代码:Bayer Ordered Dithering我认为应该这样做(未经测试)。值得一试。

答案 2 :(得分:1)

Converting Image to Black and White in 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} 
     };

答案 3 :(得分:1)

您可以使用ImageMagick。可以通过命令行Process.Start运行它,也可以使用属于Windows安装的COM接口。选项“-monochrome”是你的朋友。

答案 4 :(得分:0)

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

或者,如果您不需要抖动,请找到平均亮度并将其上方的所有像素变为白色,将其下方的像素变为黑色。

答案 5 :(得分:-1)

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);
        }


    }
}