二色TIF分割的问题。
现在公司的TIF分割文件,都是一些黑白二色的TIF。
我把它们分割以后,分割的时候会自动转换成32位色,这样分割出来的小文件比原文件还大。我把它在从新转换成二色的文件的时候,会损失图像的清晰度。
请问,如果实现二色TIF文件的分割和合成(就是把多个二色的tif文件合成为一个)?并且保持二色,清晰度不变?
多谢指点!
------解决方案--------------------http://www.codeproject.com/cs/media/SaveMultipageTiff.asp
------解决方案--------------------Bitmap如果读入的是高位色的图片后再用ColorDepth降低无效,后来我查了些资料,可以通过转成Gif再保存,这样就可以转为低位的了
代码如下:
private void button10_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap("c:\\a.bmp");
SaveGIFWithNewColorTable(bmp, "c:\\b.bmp", 1, false);
}
protected void SaveGIFWithNewColorTable(Image image, string filename, uint nColors, bool fTransparent)
{
if (nColors > 256)
nColors = 256;
if (nColors < 2)
nColors = 2;
int Width = image.Width;
int Height = image.Height;
Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed);
ColorPalette pal = GetColorPalette(nColors);
for (uint i = 0; i < nColors; i++)
{
uint Alpha = 0xFF; // Colors are opaque.
uint Intensity = i * 0xFF / (nColors - 1); // Even distribution.
if (i == 0 && fTransparent) // Make this color index...
Alpha = 0; // Transparent
pal.Entries[i] = Color.FromArgb((int)Alpha,
(int)Intensity,
(int)Intensity,
(int)Intensity);
}
bitmap.Palette = pal;
Bitmap BmpCopy = new Bitmap(Width,
Height,
PixelFormat.Format32bppArgb);
{
Graphics g = Graphics.FromImage(BmpCopy);
g.PageUnit = GraphicsUnit.Pixel;
g.DrawImage(image, 0, 0, Width, Height);
g.Dispose();
}
BitmapData bitmapData;
Rectangle rect = new Rectangle(0, 0, Width, Height);
bitmapData = bitmap.LockBits(
rect,
ImageLockMode.WriteOnly,
PixelFormat.Format8bppIndexed);
IntPtr pixels = bitmapData.Scan0;
unsafe
{
byte* pBits;
if (bitmapData.Stride > 0)
pBits = (byte*)pixels.ToPointer();
else
pBits = (byte*)pixels.ToPointer() + bitmapData.Stride * (Height - 1);
uint stride = (uint)Math.Abs(bitmapData.Stride);
for (uint row = 0; row < Height; ++row)
{
for (uint col = 0; col < Width; ++col)
{
Color pixel; // The source pixel.
byte* p8bppPixel = pBits + row * stride + col;
pixel = BmpCopy.GetPixel((int)col, (int)row);
double luminance = (pixel.R * 0.299) +
(pixel.G * 0.587) +
(pixel.B * 0.114);
*p8bppPixel = (byte)(luminance * (nColors - 1) / 255 + 0.5);
} /* end loop for col */
} /* end loop for row */
} /* en