解决方案 »
- 高手请进,100分求:SPRP(斯普瑞特)POS58票据打印机驱动调用程序
- winform项目我打开一个窗体,xp下方任务栏就多出一个图标,不喜欢。
- 做用户注册功能时怎样吧 注册的账号,密码存到数据库里?
- 请问个小问题?
- xml转化问题!
- winform 调用form.Show() 窗体无响应问题
- 如何将一个表中的VarBinary字段的值读出来,存入另个表的VarBinary字段中?
- 非常着急,谢谢那位大侠现在提供源码参考,200分相送
- 十万火急,用Visual C#读Excel文件的发现的新问题!!!
- ShowDialog显示image关闭后,不退出再次调用ShowDialog,结果出错:因为该图片文件正由另一进程使用
- WebBrower控件如何实现缩略显示网页
- 关于CustomValidator控件的应用问题!!!(急)
如果先要改变图片的大小,jpeg图片还可以对图片质量进行压缩 /// <summary>
/// jpeg图片压缩
/// </summary>
/// <param name="sFile"></param>
/// <param name="outPath"></param>
/// <param name="flag">压缩质量</param>
/// <returns></returns>
public static bool GetPicThumbnail(string sFile, string outPath, int flag)
{
System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
ImageFormat tFormat = iSource.RawFormat; //以下代码为保存图片时,设置压缩质量
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1];
qy[0] = flag;//设置压缩的比例1-100
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
ep.Param[0] = eParam;
try
{
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICIinfo = null;
for (int x = 0; x < arrayICI.Length; x++)
{
if (arrayICI[x].FormatDescription.Equals("JPEG"))
{
jpegICIinfo = arrayICI[x];
break;
}
}
if (jpegICIinfo != null)
{
iSource.Save(outPath, jpegICIinfo, ep);//dFile是压缩后的新路径
}
else
{
iSource.Save(outPath, tFormat);
}
return true;
}
catch
{
return false;
}
finally
{
iSource.Dispose();
iSource.Dispose();
}
} }
bmpTarget = TiffManager.KiSharpen(bmpTarget, (float)0.7);
这句是什么意思?在这出错了!出错提示:
CS0103: The name 'TiffManager' does not exist in the current context
bmpTarget = TiffManager.ConvertTo1bbpIndexed(bmpTarget, (float)0.8);
主要是这一句,这个就是设置dpi的,设置完成后查看图片的高级属性图片的dpi已经改变了
dpi的数值不会影响到图片的本身大小,应该是打印时候的一个参数来使用的。
如果想要改变图片的大小,jpeg图片可以通过我给你的那个方法来设置压缩比
我搜索过,这样用SetResolution确实只能改变名义上的属性数值,对分辨率没有影响,是不是用的不对?而且PixelFormat.Format32bppPArgb也不知道具体用法。
位深度指的又是什么?
SetResolution改变就是图片的dpi
Bitmap截图默怎样设置这两个参数?
以下是截图代码
/// <summary>
/// 根据范围从原始图像中截取
/// </summary>
/// <param name="sourceImage"></param>
/// <param name="cutRectangle"></param>
/// <returns></returns>
public Bitmap CutImageByRectangle(Bitmap sourceImage, Rectangle cutRectangle)
{
Bitmap resultBitmap = new Bitmap(cutRectangle.Width, cutRectangle.Height);
using (Graphics g = Graphics.FromImage(resultBitmap))
{
Rectangle resultRectangle = new Rectangle(0, 0, cutRectangle.Width, cutRectangle.Height);
Rectangle sourceRectangle = new Rectangle(cutRectangle.X, cutRectangle.Y, cutRectangle.Width, cutRectangle.Height);
g.DrawImage(sourceImage, resultRectangle, sourceRectangle, GraphicsUnit.Pixel);
}
return resultBitmap;
}
还有,网上也有介绍改变位深度的文章,你给我的例子是变成1——变成黑白的!可我运行不了那段代码,总出错!
这是msdn给的解释
之前给你的那个方法是没有问题的,能够压缩问价你的大小。如果你要做马赛克的效果,可以通过其他方式实现
马赛克
另外如果有条件可以尝试把dpi改变后打印出来,看看这个参数是不是用开控制打印时的dpi的
分辨率是用来联系图片的像素尺寸和物理尺寸的,只有需要在二者之间转化的时候才能体现出作用。比如,扫描仪在扫描的时候需要记录下原件的物理尺寸,怎么记录呢,就是记录下自己生成图片时使用的分辨率。打印机在打印图片的时候是按照图片的物理尺寸打印,打印机怎么知道图片的物理尺寸是多少呢?这个时候就需要借助分辨率信息把像素尺寸转化为物理尺寸。而电脑上大部分程序忽略图片的分辨率信息,如实地显示图片文件的每一个像素,也就是是按照图片的像素大小在显示。所以不管你怎么改分辨率,在电脑上看图片的“大小”不会变。当然有些印刷设计相关的软件是会模拟“物理尺寸”显示的,比如PhotoShop。顺便说一下,.NET中的Graphics.DrawImage的最简单重载也是按照“物理尺寸”在绘制,所以有时候你会发觉他画出来的图片的大小和图片在其他软件,比如图片浏览器,中的大小不一致。如果你单纯地改变分辨率信息,意味着改变图片的物理尺寸。分辨率调高,物理尺寸变小,打印出来图片变小,清晰度变高;分辨率调低,物理尺寸变大,打印出来图片变大,清晰度变低。如果你想要改变分辨率而不影响图片的物理尺寸,那你还得改变图片的像素尺寸。增大分辨率,需要补充更多的像素;减小分辨率,需要删除掉一些多余的像素。至于怎么补充,怎么删除,有很多不同的算法。ps有这个功能,好像就提供了几种不同的算法供选择。
在PS上反复对比,明白SetResolution改变的DPI是什么效果了。
可是下面这句是设置位深度的:
bmpTarget = TiffManager.ConvertTo1bbpIndexed(bmpTarget, (float)0.8);
报错了!该怎样设置位深度呢?
bmp.SetResolution(96,96);