111,094
社区成员




Rectangle cutRect = row[colIndex];
Bitmap cutBitmap = pic.Clone(cutRect, pic.PixelFormat);
Graphics g = Graphics.FromImage(cutBitmap);
ImageCodecInfo cutImageCodecInfo = ImageCodecInfo.GetImageEncoders()[0];
List<System.Drawing.Imaging.Encoder> encoderList = new List<Encoder>();
encoderList.Add(System.Drawing.Imaging.Encoder.Quality);
//encoderList.Add(System.Drawing.Imaging.Encoder.ColorDepth);
//encoderList.Add(System.Drawing.Imaging.Encoder.ChrominanceTable);
List<EncoderParameter> encoderParameter = new List<EncoderParameter>();
for (int i = 0; i < encoderList.Count; i++)
{
encoderParameter.Add(new EncoderParameter(encoderList[i], long.MinValue));
}
EncoderParameters cutEncoderParameters = new EncoderParameters(encoderList.Count);
//设置质量
cutEncoderParameters.Param = encoderParameter.ToArray();
//保存切片
string cutBmpFileName = cutBmpsPath + "\\" + rowIndex + "_" + colIndex + _sourceBitmapExtensioinName;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
g.DrawImage(cutBitmap, new Point());
cutBitmap.Save(cutBmpFileName, cutImageCodecInfo, cutEncoderParameters);
/// <summary>
/// A quick lookup for getting image encoders
/// </summary>
private static Dictionary<string, ImageCodecInfo> encoders = null;
/// <summary>
/// A quick lookup for getting image encoders
/// </summary>
public static Dictionary<string, ImageCodecInfo> Encoders
{
//get accessor that creates the dictionary on demand
get
{
//if the quick lookup isn't initialised, initialise it
if (encoders == null)
{
encoders = new Dictionary<string, ImageCodecInfo>();
}
//if there are no codecs, try loading them
if (encoders.Count == 0)
{
//get all the codecs
foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
{
//add each codec to the quick lookup
encoders.Add(codec.MimeType.ToLower(), codec);
}
}
//return the lookup
return encoders;
}
}
/// <summary>
/// Returns the image codec with the given mime type
/// </summary>
public static ImageCodecInfo GetEncoderInfo(string mimeType)
{
//do a case insensitive search for the mime type
string lookupKey = mimeType.ToLower();
//the codec to return, default to null
ImageCodecInfo foundCodec = null;
//if we have the encoder, get it to return
if (Encoders.ContainsKey(lookupKey))
{
//pull the codec from the lookup
foundCodec = Encoders[lookupKey];
}
return foundCodec;
}
ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/png");//ImageCodecInfo.GetImageEncoders()[0];//
EncoderParameters myEncodeParameters = new EncoderParameters(3);
EncoderParameter myEncoderParameter1 = new EncoderParameter(Encoder.Quality, 25L);
EncoderParameter myEncoderParameter2 = new EncoderParameter(Encoder.ColorDepth, 8L);//想设置为8位色深,完全无反应,NND
EncoderParameter myEncoderParameter3 = new EncoderParameter(Encoder.Compression, 50L);//压缩参数设置为0,还是不行。
myEncodeParameters.Param[0] = myEncoderParameter1;
myEncodeParameters.Param[1] = myEncoderParameter2;
myEncodeParameters.Param[2] = myEncoderParameter3;
Bitmap bmp = new Bitmap("TestPic/test.png"); // Lock the bitmap's bits.
//bmp = bmp.Clone(new Rectangle(0, 0, bmp.Width, bmp.Height), PixelFormat.Format8bppIndexed);
MemoryStream sourceMs = new MemoryStream();
bmp.Save(sourceMs, bmp.RawFormat);
byte[] sourceBytes = sourceMs.ToArray();
Bitmap newBmp = new Bitmap(bmp.Width, bmp.Height);
//newBmp.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
newBmp.SetResolution(72, 72);
Graphics g = Graphics.FromImage(newBmp);
g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
g.CompositingQuality = CompositingQuality.HighSpeed;
g.SmoothingMode = SmoothingMode.HighSpeed;
g.InterpolationMode = InterpolationMode.Low;
g.DrawImage(bmp, 0, 0);
//pictureBox_Image.Image = newBmp;
MemoryStream ms = new MemoryStream();
newBmp.Save(ms, myImageCodecInfo, myEncodeParameters);
Bitmap tempBmp = new Bitmap(ms);
pictureBox_Image.Image = tempBmp;
byte[] newBytes = ms.ToArray();
FileStream fs = new FileStream(
@"TestPic/test1.png",
FileMode.Create, System.Security.AccessControl.FileSystemRights.FullControl,
FileShare.None, 1024, FileOptions.Asynchronous);
fs.Write(newBytes, 0, newBytes.Length);
fs.Dispose();
fs = null;
MessageBox.Show(
"source bmp info : \r\n"+
(float)sourceBytes.Length / 1024 + "kb\r\n"+
"colorBit : " + Bitmap.GetPixelFormatSize(bmp.PixelFormat) + "\r\n"+
"isCanAlpha : " + Bitmap.IsAlphaPixelFormat(bmp.PixelFormat) + "\r\n"+
"pixel : " + bmp.PixelFormat +
"\r\n\r\ntarget bmp info : \r\n" +
(float)newBytes.Length / 1024 + "kb\r\n"+
"colorBit : " + Bitmap.GetPixelFormatSize(tempBmp.PixelFormat) + "\r\n"+
"isCanAlpha : " + Bitmap.IsAlphaPixelFormat(tempBmp.PixelFormat) + "\r\n"+
"pixel : " + tempBmp.PixelFormat);
ImageCodecInfo myImageCodecInfo = ImageCodecInfo.GetImageEncoders()[1];
EncoderParameters myEncodeParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter1 = new EncoderParameter(Encoder.Quality, 255L);
myEncodeParameters.Param[0] = myEncoderParameter1;
Bitmap bmp = new Bitmap("TestPic/test.png"); // Lock the bitmap's bits.
Bitmap newBmp = new Bitmap(bmp.Width, bmp.Height);
Graphics g = Graphics.FromImage(newBmp);
//以下:4项质量设置选项,可有可无,隐掉代码与应用代码都一样这么大的文件,与清晰度,难不成还与我的图片有关?
g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
g.CompositingQuality = CompositingQuality.HighSpeed;
g.SmoothingMode = SmoothingMode.HighSpeed;
g.InterpolationMode = InterpolationMode.Low;
g.DrawImage(bmp, 0, 0);
pictureBox_Image.Image = newBmp;
//这里不用codecInfo与Parameters的话,导出来的也是32位,但文件大小比原来的大;如果用上后面两个参数导出的话,又只成了24位,不带alpha通道的图片。汗。。。
newBmp.Save(@"TestPic/test1.png");//, myImageCodecInfo, myEncodeParameters);
RectangleF cloneRect = new RectangleF(countX * xWidth, countY * yWidth, xWidth, yWidth);
Bitmap newImage = sourceImage.Clone(cloneRect, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);//这里指定Format
Graphics thumbnailBmpGraphics = Graphics.FromImage(thumbnailBmp);
//设置切片质量,并重绘
thumbnailBmpGraphics.PixelOffsetMode = PixelOffsetMode.HighSpeed;
thumbnailBmpGraphics.CompositingQuality = CompositingQuality.HighSpeed;
thumbnailBmpGraphics.SmoothingMode = SmoothingMode.HighSpeed;
thumbnailBmpGraphics.InterpolationMode = InterpolationMode.Low;
thumbnailBmpGraphics.DrawImage(thumbnailBmp, new Point());