我在使用BitConverter.ToDouble()
将字节数组转换为双数组时遇到问题。
我的程序只需选择一个图像,然后将图像转换为字节数组。 然后它会将字节数组转换为双数组。
当我将字节数组转换为double时,我会在循环结束前得到此错误。
(目标数组不够长,无法复制集合中的所有项目。检查数组索引和长度。)
错误恰好发生在array.Length-7位置,这是阵列最后一个位置之前的第七个位置。
我需要帮助来解决这个问题,这是我的代码:
private Bitmap loadPic;
byte[] imageArray;
double[] dImageArray;
private void btnLoad_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
if (open.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = new Bitmap(open.FileName);
loadPic = new Bitmap(pictureBox1.Image);
}
}
catch
{
throw new ApplicationException("Failed loading image");
}
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}
private void btnConvert_Click(object sender, EventArgs e)
{
imageArray = imageToByteArray(loadPic);
int index = imageArray.Length;
dImageArray = new double[index];
for (int i = 0; i < index; i++)
{
dImageArray[i] = BitConverter.ToDouble(imageArray,i);
}
}
public byte[] imageToByteArray(Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, ImageFormat.Gif);
return ms.ToArray();
}
答案 0 :(得分:6)
BitConverter.ToDouble(byte[], int)
使用8个字节构造一个64位双精度,这解释了你的问题(一旦你到达第7个到最后一个元素,就不再有8个字节)。根据你设置循环的方式,我猜这是不你想做什么。
我想你想要的东西是:
for(int i = 0; i < index; i++)
{
dImageArray[i] = (double)imageArray[i];
}
编辑 - 或使用LINQ,只是为了好玩:
double[] dImageArray = imageArray.Select(i => (double)i).ToArray();
另一方面......
如果BitConverter
绝对是您想要的,那么您需要以下内容:
double[] dImageArray = new double[imageArray.Length / 8];
for (int i = 0; i < dImageArray.Length; i++)
{
dImageArray[i] = BitConverter.ToDouble(imageArray, i * 8);
}
同样,根据您的代码,我认为第一个解决方案就是您所需要的。
答案 1 :(得分:1)
课程计划 { static void Main(string [] args) {
Program p = new Program();
p.Test();
}
private void Test()
{
Image i = Image.FromFile(@"C:\a.jpg");
Bitmap b = new Bitmap(i);
MemoryStream ms = new MemoryStream();
b.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
byte[] by = ms.ToArray();
double[] db = new double[(int)(Math.Ceiling((double)by.Length / 8))];
int startInterval = 1;
int interval = 8;
int k = 0;
byte[] bys = new byte[8];
int n = 1;
for (int m = startInterval; m <= interval && m<=by.Length; m++,n++)
{
bys[n-1] = by[m-1];
if (m == interval)
{
db[k] = BitConverter.ToDouble(bys, 0);
startInterval += 8;
interval += 8;
k++;
n = 0;
Array.Clear(bys, 0, bys.Length);
}
if (m == by.Length)
{
db[k] = BitConverter.ToDouble(bys, 0);
}
}
}
}
答案 2 :(得分:0)
我认为您需要稍微补充并解释您实际上要做的事情。每个BitConverter.ToDouble将8个连续字节转换为1个double。如果从字节数组中的下一个位置开始,则使用已经使用过的7个字节。由于每次转换需要8个字节,因此您需要在长度 - 7处停止。
无论如何,你最终会把数据的大小膨胀8倍。
我认为对此有何解释可能有助于您获得更好的答案。