471,349 Members | 1,217 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,349 software developers and data experts.

Compress Image

Thanks to Bob Powel (http://www.bobpowell.net/onebit.htm) I'm able to
compress an image. However, this method takes a long time to compress an
image. Does anyone know a quicker way? (The images I have to compress are
already in black and white).

Code used:
Bitmap bmpOrig =
(System.Drawing.Bitmap)Image.FromFile(OrigFileName ).Clone();

Bitmap objConvImage = new Bitmap(bmpOrig.Width, bmpOrig.Height,
PixelFormat.Format1bppIndexed);
objConvImage.SetResolution(300,300);

BitmapData bmd = objConvImage.LockBits(new Rectangle(0, 0,
objConvImage.Width, objConvImage.Height),
ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed );

for(int y=0; y < bmpOrig.Height; y++)
{
for(int x=0; x < bmpOrig.Width; x++)
{
if(bmpOrig.GetPixel(x,y).GetBrightness()>0.5f)
SetIndexedPixel(x,y,bmd,true);
}
}
objConvImage.UnlockBits(bmd);
objConvImage.Save(FileName, _ImageCodecInfo, _ImageCodecParams);
objConvImage.Dispose();
bmpOrig.Dispose();

and the functions:
private static unsafe void SetIndexedPixel(int x, int y, BitmapData bmd,
bool pixel)
{
byte* p = (byte*)bmd.Scan0.ToPointer();
int index = y * bmd.Stride+(x>>3);
byte mask = (byte)(0x80>>(x&0x7));
if(pixel)
p[index]|=mask;

else
p[index]&=(byte)(mask^0xff);
}

private static ImageCodecInfo GetCodecInfo(string FileFormat)
{
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int j=0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == FileFormat)
return encoders[j];
}

return null;
}
Jul 22 '05 #1
3 2218

You can try this:

Bitmap bmp = new Bitmap(/*[input filename]*/);
bmp.Save(/*[output filename]*/, System.Drawing.Imaging.ImageFormat.Jpeg);

By changing the System.Drawing.Imaging.ImageFormat value, you can change
the type to convert to. Basically, all types other than BMP are lossy
(well, other than vectors, but never mind about those)
Jul 22 '05 #2
Blackice wrote:

You can try this:

Bitmap bmp = new Bitmap(/*[input filename]*/);
bmp.Save(/*[output filename]*/, System.Drawing.Imaging.ImageFormat.Jpeg);

By changing the System.Drawing.Imaging.ImageFormat value, you can change
the type to convert to. Basically, all types other than BMP are lossy
(well, other than vectors, but never mind about those)


TIF isn't lossy neither is RGA and if the bitmap is already in 8bit
color, GIF isn't lossy either. I have no idea if .net supports any of
these formats though :)

--
Rinze van Huizen
C-Services Holland b.v.
Jul 22 '05 #3
I know that I can change the type this way. However, the saved imaged isn't
compressed. I want to compress the tiff image. It only holds black and white.

Edward

"Blackice" wrote:

You can try this:

Bitmap bmp = new Bitmap(/*[input filename]*/);
bmp.Save(/*[output filename]*/, System.Drawing.Imaging.ImageFormat.Jpeg);

By changing the System.Drawing.Imaging.ImageFormat value, you can change
the type to convert to. Basically, all types other than BMP are lossy
(well, other than vectors, but never mind about those)

Jul 22 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

5 posts views Thread by Jigar Mehta | last post: by
3 posts views Thread by Edward | last post: by
1 post views Thread by ironpythonster | last post: by
3 posts views Thread by Samuel | last post: by
5 posts views Thread by zgh1970 | last post: by
4 posts views Thread by Lennart | last post: by
6 posts views Thread by mohammedsiddig | last post: by
reply views Thread by XIAOLAOHU | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.