using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;namespace PictureShow.PicturePackage
{
public class PicturePackageXml
{
private string name; //图片名称
private int pictureID; //图片的编号
private int segmentNumber; //图片的块编号
private int segmentTotal; //图片分割后的总块数
private int segmentSize; //图片块的大小
private byte[] buffer; //图片块的数据
public string Name {
get { return name; }
} public int PictureID {
get { return pictureID; }
}
public int SegmentNumber {
get { return segmentNumber; }
} public int SegmentTotal{
get { return segmentTotal; }
} public int SegmentSize {
get { return segmentSize; }
} public byte[] Buffer {
get { return buffer; }
}
public PicturePackageXml(string name, int pictureID, int segmentNumber, int segmentTotal, int segmentSize,byte[] bufferData) {
this.name = name;
this.pictureID = pictureID;
this.segmentNumber = segmentNumber;
this.segmentTotal = segmentTotal;
this.segmentSize = segmentSize;
this.buffer = bufferData;
}
}using System;
using System.Collections.Generic;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Diagnostics;namespace PictureShow.PicturePackage
{
public class PicturePackages
{
public PicturePackages() { }
/// <summary>
/// 对图片进行分割
/// </summary>
/// <param name="sementSize">每个块的大小</param>
/// <param name="suffix">文件后缀名</param>
public PicturePackageXml[] SplitPicture(string name, int id, Image image, int sementSize,
int suffix) {
MemoryStream ms = new MemoryStream(); //switch(suffix) { //根据文件后缀名suffix,生成 *.Bmp、*.Gif、*.Jpeg格式的图片
// case 0:
image.Save(ms,ImageFormat.Bmp);
//break;
// case 1:
// image.Save(ms, ImageFormat.Gif);
// break;
// default:
// image.Save(ms, ImageFormat.Jpeg);
// break;
//} int segmentTotal = (int)ms.Position / sementSize+1; //按输入的字节计算改图片分割成的块数
Trace.WriteLine(ms.Position.ToString());
Trace.WriteLine(segmentTotal.ToString());
PicturePackageXml[] picturePages = new PicturePackageXml[segmentTotal]; int sourceIndex = 0;
int bytesCopyTo;
for(int i=0;i<segmentTotal;i++) {
bytesCopyTo = (int)ms.Position - sourceIndex; if (bytesCopyTo > sementSize) {
bytesCopyTo = sementSize;
}
byte[] bufferSegment = new byte[bytesCopyTo]; Array.Copy(ms.GetBuffer(), sourceIndex, bufferSegment, 0, bytesCopyTo); picturePages[i] = new PicturePackageXml(name, id, i, segmentTotal, bytesCopyTo, bufferSegment); sourceIndex += bytesCopyTo;
}
return picturePages;
} /// <summary>
/// 图片合并还原
/// </summary>
/// <param name="picturePackages">图片块数组</param>
public Image UnitePicture(PicturePackageXml[] picturePackages) {
int fullPictureSize=0; //图片原始大小
int pctureID = picturePackages[0].PictureID;
int segmentTotal = picturePackages[0].SegmentTotal; foreach(PicturePackageXml picturePackage in picturePackages) {
fullPictureSize =fullPictureSize+ picturePackage.SegmentSize;
} Console.WriteLine(fullPictureSize.ToString());
byte[] pictureBuffer=new byte[fullPictureSize];
int distenation=0; for(int i=0;i<segmentTotal;i++) {
int length = picturePackages[i].Buffer.Length;
////int length = picturePackages[i].SegmentBuffer.Length;
////Array.Copy(picturePackages[i].SegmentBuffer, 0, buffer, distenation, length);
////distenation += length; Array.Copy(picturePackages[i].Buffer, 0, pictureBuffer, distenation, length);
distenation += length;
Console.Write(distenation.ToString() + " ");
Console.WriteLine(pictureBuffer.Length.ToString());
} MemoryStream ms = new MemoryStream(pictureBuffer);//,0,pictureBuffer.Length);
Image image = Image.FromStream(ms); return image;
}
}
}
我有这样两个类,是将图片进行分割,然后存入xml在用udp进行传输,转xml部分暂不实现,现在的问题是图片分割后无法还原,请高人指点下。
using System.Linq;
using System.Text;
using System.Xml;namespace PictureShow.PicturePackage
{
public class PicturePackageXml
{
private string name; //图片名称
private int pictureID; //图片的编号
private int segmentNumber; //图片的块编号
private int segmentTotal; //图片分割后的总块数
private int segmentSize; //图片块的大小
private byte[] buffer; //图片块的数据
public string Name {
get { return name; }
} public int PictureID {
get { return pictureID; }
}
public int SegmentNumber {
get { return segmentNumber; }
} public int SegmentTotal{
get { return segmentTotal; }
} public int SegmentSize {
get { return segmentSize; }
} public byte[] Buffer {
get { return buffer; }
}
public PicturePackageXml(string name, int pictureID, int segmentNumber, int segmentTotal, int segmentSize,byte[] bufferData) {
this.name = name;
this.pictureID = pictureID;
this.segmentNumber = segmentNumber;
this.segmentTotal = segmentTotal;
this.segmentSize = segmentSize;
this.buffer = bufferData;
}
}using System;
using System.Collections.Generic;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Diagnostics;namespace PictureShow.PicturePackage
{
public class PicturePackages
{
public PicturePackages() { }
/// <summary>
/// 对图片进行分割
/// </summary>
/// <param name="sementSize">每个块的大小</param>
/// <param name="suffix">文件后缀名</param>
public PicturePackageXml[] SplitPicture(string name, int id, Image image, int sementSize,
int suffix) {
MemoryStream ms = new MemoryStream(); //switch(suffix) { //根据文件后缀名suffix,生成 *.Bmp、*.Gif、*.Jpeg格式的图片
// case 0:
image.Save(ms,ImageFormat.Bmp);
//break;
// case 1:
// image.Save(ms, ImageFormat.Gif);
// break;
// default:
// image.Save(ms, ImageFormat.Jpeg);
// break;
//} int segmentTotal = (int)ms.Position / sementSize+1; //按输入的字节计算改图片分割成的块数
Trace.WriteLine(ms.Position.ToString());
Trace.WriteLine(segmentTotal.ToString());
PicturePackageXml[] picturePages = new PicturePackageXml[segmentTotal]; int sourceIndex = 0;
int bytesCopyTo;
for(int i=0;i<segmentTotal;i++) {
bytesCopyTo = (int)ms.Position - sourceIndex; if (bytesCopyTo > sementSize) {
bytesCopyTo = sementSize;
}
byte[] bufferSegment = new byte[bytesCopyTo]; Array.Copy(ms.GetBuffer(), sourceIndex, bufferSegment, 0, bytesCopyTo); picturePages[i] = new PicturePackageXml(name, id, i, segmentTotal, bytesCopyTo, bufferSegment); sourceIndex += bytesCopyTo;
}
return picturePages;
} /// <summary>
/// 图片合并还原
/// </summary>
/// <param name="picturePackages">图片块数组</param>
public Image UnitePicture(PicturePackageXml[] picturePackages) {
int fullPictureSize=0; //图片原始大小
int pctureID = picturePackages[0].PictureID;
int segmentTotal = picturePackages[0].SegmentTotal; foreach(PicturePackageXml picturePackage in picturePackages) {
fullPictureSize =fullPictureSize+ picturePackage.SegmentSize;
} Console.WriteLine(fullPictureSize.ToString());
byte[] pictureBuffer=new byte[fullPictureSize];
int distenation=0; for(int i=0;i<segmentTotal;i++) {
int length = picturePackages[i].Buffer.Length;
////int length = picturePackages[i].SegmentBuffer.Length;
////Array.Copy(picturePackages[i].SegmentBuffer, 0, buffer, distenation, length);
////distenation += length; Array.Copy(picturePackages[i].Buffer, 0, pictureBuffer, distenation, length);
distenation += length;
Console.Write(distenation.ToString() + " ");
Console.WriteLine(pictureBuffer.Length.ToString());
} MemoryStream ms = new MemoryStream(pictureBuffer);//,0,pictureBuffer.Length);
Image image = Image.FromStream(ms); return image;
}
}
}
我有这样两个类,是将图片进行分割,然后存入xml在用udp进行传输,转xml部分暂不实现,现在的问题是图片分割后无法还原,请高人指点下。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货