//因为浏览器安全问题,无法获取上传图片地址,需要先存一遍然后再获取地址作参数上传

var des = CompressImage(@"C:\Users\PC\Pictures\测试\1652344981(1).jpg", @"C:\Users\PC\Pictures\测试\ok.jpg");

Console.WriteLine(des);

Console.ReadLine();

///



/// 无损压缩图片

///

/// 原图片地址

/// 压缩后保存图片地址

/// 压缩质量(数字越小压缩率越高)1-100

/// 压缩后图片的最大大小

/// 是否是第一次调用

///

bool CompressImage(string sFile, string dFile, int flag = 90, int size = 200, bool sfsc = true)

{

//如果是第一次调用,原始图像的大小小于要压缩的大小,则直接复制文件,并且返回true

FileInfo firstFileInfo = new FileInfo(sFile);

if (sfsc == true && firstFileInfo.Length < size * 1024)

{

firstFileInfo.CopyTo(dFile); return true;

}

Image iSource = Image.FromFile(sFile);

ImageFormat tFormat = iSource.RawFormat;

int dHeight = iSource.Height / 2;

int dWidth = iSource.Width / 2;

int sW = 0, sH = 0;

//按比例缩放

Size tem_size = new Size(iSource.Width, iSource.Height);

if (tem_size.Width > dHeight || tem_size.Width > dWidth)

{

if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))

{

sW = dWidth; sH = (dWidth * tem_size.Height) / tem_size.Width;

}

else

{

sH = dHeight;

sW = (tem_size.Width * dHeight) / tem_size.Height;

}

}

else

{

sW = tem_size.Width;

sH = tem_size.Height;

}

Bitmap ob = new Bitmap(dWidth, dHeight);

using (Graphics g = Graphics.FromImage(ob)) //原代码再服务器上经常爆内存不足

{

g.Clear(Color.WhiteSmoke);

g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);

g.Dispose();

}

//以下代码为保存图片时,设置压缩质量

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)

{

ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径

FileInfo fi = new FileInfo(dFile);

if (fi.Length > 1024 * size)

{

flag = flag - 10;

CompressImage(sFile, dFile, flag, size, false);

}

}

else

{

ob.Save(dFile, tFormat);

}

return true;

}

catch { return false; }

finally { iSource.Dispose(); ob.Dispose(); }

}

//JS版本

转至:https://blog.csdn.net/wrongyao/article/details/104807924

C#/JS 压缩到指定大小的图片 (内存不足问题修改)的更多相关文章

  1. C# 图片超过指定大小将压缩到指定大小不失真

    using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;us ...

  2. iOS学习——图片压缩到指定大小以内

    一.图片压缩简述 在我们开发过程中,有可能会遇到拍照.或者从相册中选择图片,要么单选或者多选,然后上传图片到服务器,一般情况下一张图片可能3-4M,如果类似微信朋友圈上传9张图片大约是 35M左右,如 ...

  3. 微信小程序 上传图片并等比列压缩到指定大小

    微信小程序官方API中  wx.chooseImage() 是可以进行图片压缩的,可惜的是不能压缩到指定大小. 实际开发中需求可能是压缩到指定大小: 原生js可以使用canvas来压缩,但由于微信小程 ...

  4. PHP 生成指定大小随机图片

    PHP 生成指定大小随机图片 <?php $image_width = 100; $image_height = 100; $image_str = ''; if (isset($_GET['w ...

  5. iOS 图片按比例压缩,指定大小压缩

    使用系统方法UIImageJPEGRepresentation(UIimage *image,CGFloat quality)进行图片质量压缩,暂且叫参数quality为压缩比吧,取值范围为0-1. ...

  6. PHP JS HTML ASP页面跳转代码 延时跳转代码 返回到上一界面并刷新 JS弹出指定大小的新窗口

    1.PHP延时跳转代码 //跳转到浏览界面 header("Refresh:1;url=machine_list.php"); //不延时 <?php header(&quo ...

  7. vue+element-ui upload图片上传前大小超过4m,自动压缩到指定大小,长宽

    最近项目需要实现一个需求,用户上传图片时,图片大小超过4M,长宽超过2000,需要压缩到400k,2000宽高.在git上找到一个不错的方法,把实现方法总结一下: 安装image-conversion ...

  8. [Android算法] bitmap 将图片压缩到指定的大小

    Bitmap压缩到指定大小: private void imageZoom() {//图片允许最大空间 单位:KBdouble maxSize =400.00;//将bitmap放至数组中,意在bit ...

  9. Bitmap压缩到指定尺寸大小,获取圆角、圆形图片

    /** * 使用Matrix将Bitmap压缩到指定大小 * @param bitmap * @param w * @param h * @return */ public static Bitmap ...

  10. C# 压缩图片到指定宽度,假如图片小于指定宽度 判断图片大小是否大于指定大小(KB) 如果大于则压缩图片质量 宽高不变

    class Program { static void Main(string[] args) {//G:\zhyue\backup\projects\Test\ConsoleApplication1 ...

随机推荐

  1. 【Shell案例】【while循环、正则表达式、sed、awk、grep】5、打印空行的行号

    描述写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始 示例:假设 nowcoder.txt 内容如下:ab c d e f 你的脚本应当输出:35791 ...

  2. 【Java EE】Day03 DQL、约束、数据库设计、范式、备份和还原

    〇.总结 1.DQL 聚合函数有空值需要使用ifnull函数 where不能使用聚合函数 分页开始索引的计算,及mysql和oracle的方言 2.约束 删除唯一约束DROP INDEX 列名; 3. ...

  3. 记录一次 MyBatis 批量插入的优化-BatchInsert

    记录在一次项目问题排查过程中,遇到在数据量大的情况下,向数据库批量插入非常耗时长的问题. 1.分析 首先,代码是在 service 中,采用的是 for 循环调用 insert 语句的方式: for( ...

  4. Redis分布式锁应用

    Redis锁的使用 起因:分布式环境下需对并发进行逻辑一致性控制 架构:springboot2.Redis IDEA实操 先新建RedisLock组件 注:释放锁使用lua脚本保持原子性 @Compo ...

  5. sql周报

    数据库分类 1.关系型数据库 Mysql Qracle MariaDB PostgreSQL mysql:开源免费 使用最广 性价比最高 Oracle:收费 但安全性高 PostgreSQL:开源免费 ...

  6. python重要内置模块

    目录 包的概念 包的具体使用 编程思想的转变 常用内置模块之collections模块 (收集) 常用内置模块之time模块 (时间) 常用内置模块之random模块 (随机) os模块 sys模块 ...

  7. 解决Win10更新后远程桌面提示CredSSP加密Oracle修正的问题

    1.以管理员身份打开cmd,运行命令提示符:2.执行REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Cre ...

  8. week_8

    Andrew Ng 机器学习笔记 ---By Orangestar Week_7_Unsupervised Learning While supervised learning algorithms ...

  9. 新款 c++ web framework 支持orm http/2

    c++ web framework很少, 随着c++ 热度升温,c++ 在人工智能 自然语言处理 加快应用. 最近一款国产 c++ web framework 问世 写业务速度跟脚步语言一样速度 自带 ...

  10. centos更新glibc-2.28

    vps安装alist时提示glibc版本太老,找了一圈教程,就这个解决了问题. 原文: https://www.cnblogs.com/FengZeng666/p/15989106.html