调整图片分辨率和压缩图片大小

private void 廿四 2019-02-26 03:13:52
因为项目需要 要求我把给定的图片调整分辨率和压缩图片大小。在网上查找了很多大神的建议和源码,但是所有问题都集中在一个点上:图片的尺寸 给定的图片尺寸为 过于巨大


说一下我尝试过的方法:
1.使用 Image pImage = Image.FromFile("图片路径");------无效 错误提示:内存不足
2.使用
FileStream fs = File.OpenRead(s); //OpenRead
int filelength = 0;
filelength = (int)fs.Length; //获得文件长度
Byte[] image = new Byte[filelength]; //建立一个字节数组

fs.Read(image, 0, filelength); //按字节流读取
System.Drawing.Image result = System.Drawing.Image.FromStream(fs);
fs.Close();
Bitmap bit = new Bitmap(result);


无效 提示内存不足


请问诸位前辈,有没有一种方法 可以不实例化图片对象 而实现对图片的处理?
...全文
796 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
desperaso 2019-02-26
  • 打赏
  • 举报
回复
可能不大对题,前面发过的,图像局部透明的,原理差不多,参考着改改

/// <summary>
/// 图像挖洞
/// </summary>
/// <param name="_x">透明位置x</param>
/// <param name="_y">透明位置x</param>
/// <param name="_width">透明宽度</param>
/// <param name="_height">透明高度</param>
/// <param name="src">图像</param>
/// <param name="num">图像整体透明度</param>
/// <param name="trans">挖洞部分透明度</param>
/// <returns></returns>
public Bitmap potholing (int _x,int _y,int _width, int _height, Bitmap src, int num, int trans)
{
try
{
int w = src.Width;
int h = src.Height;
Bitmap dstBitmap = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Drawing.Imaging.BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Drawing.Imaging.BitmapData dstData = dstBitmap.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
unsafe
{
byte* pIn = (byte*)srcData.Scan0.ToPointer();
byte* pOut = (byte*)dstData.Scan0.ToPointer();
byte* p;
int stride = srcData.Stride;
int r, g, b;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
p = pIn;
b = pIn[0];
g = pIn[1];
r = pIn[2];
pOut[1] = (byte)g;
pOut[2] = (byte)r;

if ((y > _y) && (y < _height) && (x > _x) && (x < _height))
{
pOut[3] = (byte)trans;
} else pOut[3] = (byte)num;

pOut[0] = (byte)b;
pIn += 4;
pOut += 4;
}
pIn += srcData.Stride - w * 4;
pOut += srcData.Stride - w * 4;
}
src.UnlockBits(srcData);
dstBitmap.UnlockBits(dstData);
return dstBitmap;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message.ToString());
return null;
}
}

public Form1()
{
InitializeComponent();
pictureBox1.Parent = pictureBox2;
}

private void button1_Click(object sender, EventArgs e)
{
Bitmap _bmp = new Bitmap(@"e.png");
_bmp = potholing(20,20,190,190,_bmp, 255,0);

pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox1.Image = _bmp;

}
}
  • 打赏
  • 举报
回复
引用 3 楼 胖叔叔写代码 的回复:
[quote=引用 2 楼 小萌咋不萌 的回复:] [quote=引用 1 楼 胖叔叔写代码 的回复:] 图片多大?如果过大建议找找分段载入和压缩的方法而不是直接这么上
图片大小在几十兆和一百兆不等,个人认为 图片大小是不困扰我的关键 关键在于图片的尺寸太大而导致无法实例化 既然无法实例化 我的想法是能通过文件流的方式按尺寸将图片切割,但是没有好的方法[/quote] 之前有看过几个cpp的库,还有netcore下也有一个image的库,你用这些库就可以直接从文件和数据的角度操作图片了。 https://github.com/SixLabors/ImageSharp 因为你是.net开发就给你推这个c#的库了。你可以看看它的样例代码,很简单的[/quote]
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;

// Image.Load(string path) is a shortcut for our default type. 
// Other pixel formats use Image.Load<TPixel>(string path))
using (Image<Rgba32> image = Image.Load("foo.jpg"))
{
    image.Mutate(x => x
         .Resize(image.Width / 2, image.Height / 2)
         .Grayscale());
    image.Save("bar.jpg"); // Automatic encoder selected based on extension.
}
你说的是这个吧?我试试
  • 打赏
  • 举报
回复
引用 2 楼 小萌咋不萌 的回复:
[quote=引用 1 楼 胖叔叔写代码 的回复:] 图片多大?如果过大建议找找分段载入和压缩的方法而不是直接这么上
图片大小在几十兆和一百兆不等,个人认为 图片大小是不困扰我的关键 关键在于图片的尺寸太大而导致无法实例化 既然无法实例化 我的想法是能通过文件流的方式按尺寸将图片切割,但是没有好的方法[/quote] 之前有看过几个cpp的库,还有netcore下也有一个image的库,你用这些库就可以直接从文件和数据的角度操作图片了。 https://github.com/SixLabors/ImageSharp 因为你是.net开发就给你推这个c#的库了。你可以看看它的样例代码,很简单的
  • 打赏
  • 举报
回复
引用 1 楼 胖叔叔写代码 的回复:
图片多大?如果过大建议找找分段载入和压缩的方法而不是直接这么上
图片大小在几十兆和一百兆不等,个人认为 图片大小是不困扰我的关键 关键在于图片的尺寸太大而导致无法实例化 既然无法实例化 我的想法是能通过文件流的方式按尺寸将图片切割,但是没有好的方法
  • 打赏
  • 举报
回复
图片多大?如果过大建议找找分段载入和压缩的方法而不是直接这么上

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧