超大图片的上传及切割

heyusuo 2017-04-10 10:59:35
各位大侠求帮助!
现在有图片上传,小的300多兆,大的1G多,现在采取的办法是:先上传到服务器,然后将大图片进行分割存储,那么问题来了,在分割前要先把大图片以bitmap形式加载到内存,但直接报内存溢出,根本加载不了,我在想,能不能通过FileStream来加载图片的一部分,这些循环的来加载切割,希望各位大大给予帮助,坐等

public static Bitmap ReadImageFile(string path)
{
FileStream fs = File.OpenRead(path); //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);
return bit;
}
...全文
398 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
//文件大小偏移  
            int filesizeOffset = 0x0002;  
            //数据区偏移  
            int dataOffset = 0x000A;  
            //图像宽度偏移  
            int widthOffset = 0x0012;  
            //图像高度偏移  
            int heightOffset = 0x0016;  
            //位数偏移  
            int bitOffset = 0x001C;  
            //是否压缩偏移  
            int compressOffset = 0x001E;  
            //数据区大小偏移  
            int datasizeOffset = 0x0022;  
   
            int width = 0;  
            int height = 0;  
            int fileheadsize = 0;  
            int dataseize = 0;  
            int offset = 0;  
            //读取待切分文件  
            string file = "c:\\1.bmp";  
            FileInfo fi = new FileInfo(file);  
            FileStream fs = fi.OpenRead();  
               
            byte[] buff = new byte[4];  
            //数据区偏移量  
            fs.Seek(dataOffset, SeekOrigin.Begin);  
            int nBytesRead = fs.Read(buff, 0, buff.Length);  
            fileheadsize = BitConverter.ToInt32(buff, 0);  
            Console.WriteLine("数据区偏移:"+fileheadsize);  
            //宽度  
            fs.Seek(widthOffset, SeekOrigin.Begin);  
            fs.Read(buff, 0, buff.Length);  
            width = BitConverter.ToInt32(buff, 0);  
            Console.WriteLine("宽度:" + width);  
            //高度  
            fs.Seek(heightOffset, SeekOrigin.Begin);  
            fs.Read(buff, 0, buff.Length);  
            height = BitConverter.ToInt32(buff, 0);  
            Console.WriteLine("高度:" + height);  
            //位数  
            fs.Seek(bitOffset, SeekOrigin.Begin);  
            fs.Read(buff, 0, buff.Length);  
            offset = BitConverter.ToInt32(buff, 0);  
            Console.WriteLine("位数:"+offset);  
            //是否压缩  
            fs.Seek(compressOffset, SeekOrigin.Begin);  
            fs.Read(buff, 0, buff.Length);  
            offset = BitConverter.ToInt32(buff, 0);  
            Console.WriteLine("压缩:" + offset);  
            //数据区大小  
            fs.Seek(datasizeOffset, SeekOrigin.Begin);  
            fs.Read(buff, 0, buff.Length);  
            dataseize = BitConverter.ToInt32(buff, 0);  
            Console.WriteLine("数据区大小:" + dataseize);  
   
            //读取图像下半部分,写入11.bmp  
            FileStream fs1 = new FileStream("c:\\11.bmp",FileMode.OpenOrCreate);  
            //复制文件头  
            fs.Seek(0,SeekOrigin.Begin);  
            byte[] filehead = new byte[fileheadsize];  
            fs.Read(filehead, 0, fileheadsize);  
            fs1.Write(filehead, 0, fileheadsize);  
            //复制数据  
            byte[] data = new byte[dataseize/2];  
            fs.Seek(fileheadsize, SeekOrigin.Begin);  
            fs.Read(data, 0, data.Length);  
            fs1.Write(data, 0, data.Length);  
   
            //修改高度,因为是水平切分,所以不需修改宽度  
            byte[]   b   =   new   byte[4];  
            b = BitConverter.GetBytes(height/2);     
            fs1.Seek(heightOffset, SeekOrigin.Begin);  
            fs1.Write(b, 0, buff.Length);  
            //修改数据区大小  
            b   =   new   byte[4];  
            b = BitConverter.GetBytes(dataseize/ 2);     
            fs1.Seek(datasizeOffset, SeekOrigin.Begin);  
            fs1.Write(b, 0, buff.Length);  
   
            //修改文件大小  
            b = new byte[4];  
            b = BitConverter.GetBytes(fs1.Length);  
            fs1.Seek(filesizeOffset, SeekOrigin.Begin);  
            fs1.Write(b, 0, buff.Length);  
   
            //关闭对象  
            fs.Close();  
            fs1.Flush();  
            fs1.Close();  
            Console.Read();  
qq_16373603 2017-07-06
  • 打赏
  • 举报
回复
楼主怎么解决的?能不能加QQ说一下:317848172
  • 打赏
  • 举报
回复
如果你们自己设计整个系统,从源头上开始规范文档、协议,要求源头就以“瓦片”形式来传图片,而不是传大图片。
  • 打赏
  • 举报
回复
如果你要分为多个小图片,那么“文件切割”概念就不适合,就需要真的按照图片读取之后再来复制到多个小图片。你要找到你之前能读取、显示大图片的工具,再来看它的接口。 其实更好的方式是定好业务规范,大图片从源头上,就应该是小图片的组合形式。例如世界地图那么大,是一系列256x256的小图片组合成的,那么传的就应该是一大堆小图片,这一大堆小图片叫做“大图片”。而不是传一个大图片。
Poopaye 2017-04-10
  • 打赏
  • 举报
回复
然后不要只会用Bitmap,看看自己解析图片,或者已经写好的库(例如AForge)
Poopaye 2017-04-10
  • 打赏
  • 举报
回复
先说一句,标题应该是超大图片如何分割,这和上传有什么关系?
peng2739956 2017-04-10
  • 打赏
  • 举报
回复
这不就是分片上传吗?。。。 我记得我的资源里面有这个 http://download.csdn.net/detail/peng2739956/9671835

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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