【问题标题】:C# Convert Image To COMPLETE Black&WhiteC# 将图像转换为完整的黑白
【发布时间】:2011-09-03 14:15:14
【问题描述】:

我有一个 gif 图像,对于我的需要来说太大了(即使它是 100~300kb)

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

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

有没有办法将我的 gif 转换为 COMPLETE 黑白?任何其他可以将 gif 缩小到更小的尺寸的方法都将受到赞赏。

【问题讨论】:

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


    【解决方案1】:

    这里是codeproject example 如何将其转换为双色调 G4 压缩 TIFF。请注意,这对于具有大量空白和文本的图像非常有用,但对于图像来说不是很好。对于图像,您可能希望查看其他答案并使用抖动。

    【讨论】:

    • 我有一张图片,它把我的 160kb 变成了 9kb。可以理解。完美。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-11-29
              • 1970-01-01
              • 1970-01-01
              • 2019-04-11
              • 2013-04-21
              • 2021-02-27
              • 2021-02-26
              • 1970-01-01
              相关资源
              最近更新 更多