/// <summary>
/// 图片转成圆角方法二
/// </summary>
private Bitmap WayTwo(Bitmap bitmap)
{
//using (Image i = new Bitmap(file))
using (Image i = bitmap)
{
Bitmap b = new Bitmap(i.Width, i.Height);
using (Graphics g = Graphics.FromImage(b))
{
g.DrawImage(i, 0, 0, b.Width, b.Height);
int r = Math.Min(b.Width, b.Height) / 2;
PointF c = new PointF(b.Width / 2.0F, b.Height / 2.0F);
for (int h = 0; h < b.Height; h++)
for (int w = 0; w < b.Width; w++)
if ((int)Math.Pow(r, 2) < ((int)Math.Pow(w * 1.0 - c.X, 2) + (int)Math.Pow(h * 1.0 - c.Y, 2)))
{
b.SetPixel(w, h, Color.Transparent);
}
}
return b;
}
} /// <summary>
/// 合并图片
/// </summary>
/// <param name="imgBack"></param>
/// <param name="img"></param>
/// <returns></returns>
public static Bitmap CombinImage(Image imgBack, Image img, int xDeviation = 0, int yDeviation = 0)
{
Bitmap bmp = new Bitmap(imgBack.Width, imgBack.Height);
Graphics g = Graphics.FromImage(bmp); g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height);
//白色边框
// g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 + xDeviation - 1, imgBack.Height / 2 - img.Height / 2 + yDeviation - 1, img.Width + 2, img.Height + 2);
//填充图片 //设置高质量插值法
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality; g.Clear(Color.Transparent); //防止出现渐变
var imgAtt = new ImageAttributes();
imgAtt.SetWrapMode(WrapMode.TileFlipXY); var x = imgBack.Width / 2 - img.Width / 2 + xDeviation;
var y = imgBack.Height / 2 - img.Height / 2 + yDeviation;
var width = img.Width;
var height = img.Height;
// g.DrawImage(img, imgBack.Width / 2 - img.Width / 2 + xDeviation, imgBack.Height / 2 - img.Height / 2 + yDeviation,img.Width , img.Height);
g.DrawImage(img, new Rectangle(0, 0, width, height), x, y, width, height, GraphicsUnit.Pixel, imgAtt); GC.Collect();
return bmp;
} /// <summary>
/// 从大图中截取一部分图片
/// </summary>
/// <param name="fromImage">来源图片</param>
/// <param name="offsetX">从偏移X坐标位置开始截取</param>
/// <param name="offsetY">从偏移Y坐标位置开始截取</param>
/// <param name="width">保存图片的宽度</param>
/// <param name="height">保存图片的高度</param>
/// <returns></returns>
public Image ResizeImage(Image fromImage, int offsetX, int offsetY, int width, int height)
{
//创建新图位图
Bitmap bitmap = new Bitmap(width, height);
//创建作图区域
Graphics graphic = Graphics.FromImage(bitmap);
//截取原图相应区域写入作图区
graphic.DrawImage(fromImage, 0, 0, new Rectangle(offsetX, offsetY, width, height), GraphicsUnit.Pixel);
//从作图区生成新图
Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());
////保存图片
//saveImage.Save(toImagePath, ImageFormat.Png);
////释放资源
//saveImage.Dispose();
//graphic.Dispose();
//bitmap.Dispose();
return saveImage;
} /// <summary>
/// 按照指定大小缩放图片,但是为了保证图片宽高比自动截取
/// </summary>
/// <param name="srcPath">原图片路径</param>
/// <param name="destWidth">目标图片宽</param>
/// <param name="destHeight">目标图片高</param>
/// <returns></returns>
public static Bitmap SizeImageWithOldPercent(Bitmap srcPath, int destWidth, int destHeight)
{
Image srcImage = srcPath;
try
{
// 要截取图片的宽度(原始宽度)
int srcWidth = srcImage.Width;
// 要截取图片的高度(原始高度)
int srcHeight = srcImage.Height;
// 截取开始横坐标
int newX = 0;
// 截取开始纵坐标
int newY = 0; // 截取比例
double whPercent = ((double)destWidth / (double)destHeight) * ((double)srcImage.Height / (double)srcImage.Width);
if (whPercent > 1)
{
// 当前图片宽度对于要截取比例过大时
srcWidth = int.Parse(Math.Round(srcImage.Width / whPercent).ToString());
}
else if (whPercent < 1)
{
// 当前图片高度对于要截取比例过大时
srcHeight = int.Parse(Math.Round(srcImage.Height * whPercent).ToString());
} if (srcWidth != srcImage.Width)
{
// 宽度有变化时,调整开始截取的横坐标
newX = Math.Abs(int.Parse(Math.Round(((double)srcImage.Width - srcWidth) / 2).ToString()));
}
else if (srcHeight == srcImage.Height)
{
// 高度有变化时,调整开始截取的纵坐标
newY = Math.Abs(int.Parse(Math.Round(((double)srcImage.Height - (double)srcHeight) / 2).ToString()));
} // 将原始图片画到目标画布上,返回目标图片
Bitmap cutedImage = CutImage(srcImage, newX, newY, srcWidth, srcHeight); // 在创建一个新的画布
Bitmap bmp = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage(bmp); //设置高质量插值法
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.Clear(Color.Transparent); //防止出现渐变
var imgAtt = new ImageAttributes();
imgAtt.SetWrapMode(WrapMode.TileFlipXY); // g.DrawImage(cutedImage, new Rectangle(0, 0, destWidth, destHeight), new Rectangle(0, 0, cutedImage.Width, cutedImage.Height), GraphicsUnit.Pixel);
// 在画板的指定位置画图
g.DrawImage(cutedImage, new Rectangle(0, 0, destWidth, destHeight), 0, 0, cutedImage.Width, cutedImage.Height, GraphicsUnit.Pixel, imgAtt);
// g.Dispose(); return bmp;
}
catch (Exception)
{
return null;
}
} /// <summary>
/// 剪裁 -- 用GDI+
/// </summary>
/// <param name="image">原始图片</param>
/// <param name="StartX">开始坐标X</param>
/// <param name="StartY">开始坐标Y</param>
/// <param name="destWidth">目标图片宽度</param>
/// <param name="destHeight">目标图片高度高度</param>
/// <returns>剪裁后的Bitmap</returns>
public static Bitmap CutImage(Image image, int StartX, int StartY, int destWidth, int destHeight)
{
int srcWidth = image.Width;
int srcHeight = image.Height;
if (StartX >= srcWidth || StartY >= srcHeight)
{
// 开始截取坐标过大时,结束处理
return null;
} if (StartX + destWidth > srcWidth)
{
// 宽度过大时只截取到最大大小
destWidth = srcWidth - StartX;
} if (StartY + destHeight > srcHeight)
{
// 高度过大时只截取到最大大小
destHeight = srcHeight - StartY;
} try
{
// 根据目标图片的大小,实例化一个画布
Bitmap bmpOut = new Bitmap(destWidth, destHeight);
// 实例化一个画笔
Graphics g = Graphics.FromImage(bmpOut); //设置高质量插值法
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.Clear(Color.Transparent); // 将原始图片画到目标画布上
// g.DrawImage(image,new Rectangle(0, 0, destWidth, destHeight), new Rectangle(StartX, StartY, destWidth, destHeight), GraphicsUnit.Pixel); //防止出现渐变(生成高质量不模糊的图片)
var imgAtt = new ImageAttributes();
imgAtt.SetWrapMode(WrapMode.TileFlipXY);
// 在画板的指定位置画图
g.DrawImage(image, new Rectangle(0, 0, destWidth, destHeight), StartX, StartY, destWidth, destHeight, GraphicsUnit.Pixel, imgAtt); g.Dispose(); return bmpOut;
}
catch
{
return null;
} }
public static Bitmap GetThumbnail(Bitmap b, int destHeight, int destWidth)
{
System.Drawing.Image imgSource = b;
System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;
int sW = 0, sH = 0;
// 按比例缩放
int sWidth = imgSource.Width;
int sHeight = imgSource.Height;
if (sHeight > destHeight || sWidth > destWidth)
{
if ((sWidth * destHeight) > (sHeight * destWidth))
{
sW = destWidth;
sH = (destWidth * sHeight) / sWidth;
}
else
{
sH = destHeight;
sW = (sWidth * destHeight) / sHeight;
}
}
else
{
return b;
//sW = sWidth;
//sH = sHeight;
} Bitmap outBmp = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage(outBmp);
//设置高质量插值法
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality; g.Clear(Color.Transparent); //防止出现渐变
var imgAtt = new ImageAttributes();
imgAtt.SetWrapMode(WrapMode.TileFlipXY);
//在画板的指定位置画图
g.DrawImage(imgSource, new Rectangle((destWidth - sW) / 2, (destHeight - sH) / 2, sW, sH), 0, 0,
imgSource.Width, imgSource.Height, GraphicsUnit.Pixel, imgAtt); g.Dispose();
// 以下代码为保存图片时,设置压缩质量
//EncoderParameters encoderParams = new EncoderParameters();
//long[] quality = new long[1];
//quality[0] = 100;
//EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
//encoderParams.Param[0] = encoderParam; imgSource.Dispose();
return outBmp;
}

  

以下是图片处理常用的一些方法;

C#常用的图片处理方法-图片剪切、图片压缩、多图合并代码的更多相关文章

  1. CSS——图片替换方法:Fahrner图片替换法(FIR)

    Html: <h1 id="fir"><span>Fahrner Image Replacement</span></h1> CSS ...

  2. MATLAB(4)——图片保存方法汇总及常用指令

    作者:桂. 时间:2017-03-03  19:30:03 链接:http://www.cnblogs.com/xingshansi/p/6498318.html 前言 本文为MATLAB系列第四篇. ...

  3. [转]常用iOS图片处理方法

    自:http://blog.sina.com.cn/s/blog_8988732e0100xcx1.html  ========== (one) UIImage 图像 等比例缩放=========== ...

  4. android图片处理方法(不断收集中)

    //压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...

  5. Android 图片处理方法

    //压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...

  6. android图片处理方法(转)

    //压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...

  7. php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明

    php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切.压缩.合并.插入文本.背景色透明等.并且有api方法调用和命令行操作两种方式,如果只是简单处理的话建议api方法 ...

  8. JAVA中pdf转图片的方法

    JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用. 一.icepdf.有收费版和开源版,几种方法里最推荐的.转换的效果比较好,能识别我手头文件中的中文, ...

  9. Hexo博客插入图片的方法

    Hexo博客插入图片的方法 hexo图片blog hexo blog 插入图片的方法总结 hexo 的blog 内容是根据 markdown 文件的内容生成的html文件, 生成的文件全部在 /pub ...

随机推荐

  1. Unity开发:5.0+版本标准资源包无内置问题

    一.问题如下: 在Unity中,一般都会内置有基础的资源包,可以在Assets->Import Package中,点击其下的子项进行导入: 但是我发现,5.0版本与之前的4.x版本相比,安装包变 ...

  2. 使用Redis搭建电商秒杀系统

    背景 秒杀活动是绝大部分电商选择的低价促销.推广品牌的方式.不仅可以给平台带来用户量,还可以提高平台知名度.一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升平台的口碑,从而 ...

  3. 安装-consul服务发现集群

    centos 7.4.x consul  1.2.2 list: 172.16.16.103 172.16.16.112 172.16.16.115 下载: #cd /usr/local/ #wget ...

  4. Orm 配置说明

    一.在线技术文档: http://files.cnblogs.com/files/humble/d.pdf   二.使用的大致流程   1.首先下载代码生成器,可以一键生成项目Model层;(其中含有 ...

  5. github打开慢,甚至打不开,怎么办,解决方案方法

    有人使用github后,在某些网络下发现打开慢,甚至打不开,这都是因为他是国外站:目前互联网的连接机制导致超过一定的路由节点的连接就会出现这个问题,解决办法就是直接告诉本机ip.不要先层层询问域名转i ...

  6. centos7.2上安装CDH5.16.2及Spark2【原创】

    背景:我自己的电脑配置太低,想在centos操作系统上安装CDH5.1.2并配置集群,我去阿里云上买了3台按流量计费的阿里云服务器. 大家一定要注意,配置,购买的阿里云服务器不要太低了.建议:3台2核 ...

  7. [JS]截取字符,中英文都可以

    //截取字符,中英文都可以,hasDot=true 返回值的最后还可以添加3个点 function subString(str, len, hasDot) { var newLength = 0; v ...

  8. scaffold

    #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import argparse ...

  9. UML类图知识

  10. Chartjs 简单使用 ------ 制作sin cos 折线图

    Chart.js 一款简单干净的图表工具,基于html5 的Javascript. 可以用来制做条形,扇形,折线,混合等等的强大工具 图表要放在html 的  cancas  标签中 <canv ...