2010-01-06 3 views
0

BitConverter.ToDouble()을 사용하여 바이트 배열을 double 배열로 변환하는 데 문제가 있습니다.바이트 배열을 double로 변환 할 때의 문제

단순히 내 프로그램에서 이미지를 선택하고 이미지를 바이트 배열로 변환합니다. 그러면 바이트 배열을 double 배열로 변환합니다.

바이트 배열을 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(); 
} 

답변

6
BitConverter.ToDouble(byte[], int) 

64 비트의 double를 구성하는 8 바이트를 사용하여, 당신은 7 일에 도착하면 (문제를 설명 : 여기이 문제를 해결하기 위해 도움을 필요로하고

내 코드입니다 마지막 요소는 더 이상 8 바이트가 남지 않음). 나는 이것을 이 아닌으로 추측하고 있습니다. 루프를 설정하는 방법에 따라 원하는대로 할 수 있습니다. 단지 재미를 위해, 또는 LINQ를 사용하여 -

for(int i = 0; i < index; i++) 
{ 
    dImageArray[i] = (double)imageArray[i]; 
} 

편집 :

한편
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); 
} 

다시 말하지만, 코드를 기반으로하면 첫 번째 해결 방법이 필요하다고 생각합니다.

+0

아니, 그게 아니에요. BitConverter와 완전히 다른 결과를 생성하는 캐스트를 사용 중입니다. –

+1

나는 자신의 루프 (및 그의 배열 초기화)를 토대로 BitConverter가 자신이 원하는 것이라고 생각하지 않는다는 것을 알리기 위해 내 게시물을 명확히했다. – Sapph

+0

네, 네가 맞다고 생각해. +1 –

0

나는 약간을 백업하고 실제로 무엇을하려고하는지 설명 할 필요가 있다고 생각한다. 각 BitConverter.ToDouble은 8 개의 연속 바이트를 1 개의 double로 변환합니다. 바이트 배열의 다음 위치에서 시작하면 이미 사용 된 7 바이트를 사용하고 있습니다. 당신은 내가 몇 가지 설명을 생각 8

의 요인에 의해 데이터의 크기를 부풀려 결국거야, 어쨌든 7

- 각각의 변환이 8 바이트가 필요합니다 때문에, 당신은 길이에서 중지해야합니다 이것이 무엇을위한 것인지 당신이 더 나은 대답을 얻는 데 도움이 될 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 내가 정확히 무엇을 필요로 배열을 입력 배열로 자기 조직지도 신경 네트워크와 거래를 사용하여 만들 수 있습니다. 이미지를 신경망에 전달합니다. – Eyla

1

클래스 프로그램 { 정적 무효 메인 (문자열 []에 인수) {

 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); 
       } 



      } 





    } 
} 
관련 문제