我有一个 gif 图像,对于我的需要来说太大了(即使它是 100~300kb)
在 Photoshop 中,我设法将我的 160kb gif 转换为 15kb(他的大小的 1/10 !!),只需将他使用的颜色数量减少到 2(黑白)。
我想在我的应用程序中做同样的事情,但我能找到的只是将图像转换为灰度,这将我的 160kb gif 转换为 100kb。
有没有办法将我的 gif 转换为 COMPLETE 黑白?任何其他可以将 gif 缩小到更小尺寸的方式都将受到赞赏。
我有一个 gif 图像,对于我的需要来说太大了(即使它是 100~300kb)
在 Photoshop 中,我设法将我的 160kb gif 转换为 15kb(他的大小的 1/10 !!),只需将他使用的颜色数量减少到 2(黑白)。
我想在我的应用程序中做同样的事情,但我能找到的只是将图像转换为灰度,这将我的 160kb gif 转换为 100kb。
有没有办法将我的 gif 转换为 COMPLETE 黑白?任何其他可以将 gif 缩小到更小尺寸的方式都将受到赞赏。
这是一个代码项目示例,说明如何将其转换为双色调 G4 压缩 TIFF。请注意,这对于具有大量空白和文本的图像非常有用,但对于图像来说不是很好。对于图像,您可能希望查看其他答案并使用抖动。
SO上有一些代码:Bayer Ordered Dithering我认为应该这样做(未经测试)。值得一试。
/*
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}
};
您可以为此使用ImageMagick 。要么通过命令行运行它Process.Start
,要么使用作为 Windows 安装一部分的 COM 接口。选项“-monochrome”是你的朋友。
查看 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);
}
}
}