Я получаю от сокета image как byte[], а затем пытаюсь показать его как pictureBox. Когда я запускаю код, отображается сообщение об ошибке: "NullReferenceException"

Уловка, обрабатывающая исключение, - это ex1, и я проверил, а pic не null, поэтому я не могу понять, почему возникает это исключение.

Это мой код:

try
{
    if (pictureBox1.InvokeRequired)
    {
        try
        {
            pic = imageEmp;
            addControlHandler c = new addControlHandler(addPic);
            this.Invoke(c);
        }
        catch (Exception exc) { MessageBox.Show(exc.Message); }
    }
    else
    {
        pictureBox1.Image = ByteToImage(imageEmp);
    }
}
catch (Exception ex1) 
{
    MessageBox.Show(ex1.Message);                
}

public void addPic()  //when invokeRequired == true
{
    pictureBox1.Image = ByteToImage(pic); 
}

Вот код для преобразования byte[] в Image:

public Image ByteToImage(byte[] imageBytes)  //convert byte[] to image
{
    MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
    ms.Write(imageBytes, 0, imageBytes.Length);
    Image image = new Bitmap(ms); 
    return image;
}

ОБНОВЛЕНИЕ 1 . Что касается ответа Ханса, я вношу следующие изменения:

Измените мой ByteToImage на ответ Ханса и, чтобы проверить, где ошибка, я добавил эти строки в то место, где был this.Invoke(c):

if (c != null)
{
    try
    {
        this.Invoke(c);
    }
    catch (Exception e_c)
    {
        MessageBox.Show(e_c.Message, "exc from e_c");
    }
}

Это дает мне исключение: NullReferenceException

Спасибо за любую помощь!

ОБНОВЛЕНИЕ 2: Теперь он работает, я отправляю изображения в формате JPEG вместо JPG, и теперь он это показывает. Не знаю, почему это происходит, но теперь все работает нормально.

0
Ignacio Gómez 1 Авг 2012 в 22:17
1
Вы пробовали использовать точку останова? Где у вас исключение?
 – 
phadaphunk
1 Авг 2012 в 22:20
Насколько вы уверены в том, что все содержимое и только содержимое изображения было получено в вашу переменную imageBytes?
 – 
tcarvin
1 Авг 2012 в 22:21
Я проверил ее, проверив imageEmp.Lenght, и все в порядке
 – 
Ignacio Gómez
1 Авг 2012 в 22:23
Вам не нужен поток памяти ... также это winform или веб-форма на основе вашего ответа, я могу предоставить вам простое решение
 – 
MethodMan
1 Авг 2012 в 22:23
Я не отлаживаю из Visual Studio, потому что, когда я подключен к GPRS, я не могу отладить его, я не знаю почему ..
 – 
Ignacio Gómez
1 Авг 2012 в 22:25

1 ответ

Лучший ответ

Вот пример, который вы можете попробовать. Я только что протестировал это, используя свой собственный метод, который работает, поэтому замените ваш код строками кода в моем btnStudentPic_Click, дайте мне знать, работает ли это для вас ..

Для Compact Framework попробуйте вместо этого

public static byte[] ReadAllBytes(string path)
{
byte[] buffer;

using (FileStream fs = new FileStream(path, FileMode.Open,
FileAccess.Read, FileShare.Read))
{
int offset = 0;
int count = (int)fs.Length;
buffer = new byte[count];
while (count > 0)
{
int bytesRead = fs.Read(buffer, offset, count);
offset += bytesRead;
count -= bytesRead;
}
}

return buffer;
}

// Пример Windows ниже не используется для CF

    private void btnStudentPic_Click(object sender, EventArgs e)
    {
        Image picture = (Image)BrowseForPicture();
        this.picStudent.Image = picture;
        this.picStudent.SizeMode = PictureBoxSizeMode.StretchImage;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    private Bitmap BrowseForPicture()
    {
       // Bitmap picture = null;

        try
        {
            if (this.fdlgStudentPic.ShowDialog() == DialogResult.OK)
            {
                byte[] imageBytes = File.ReadAllBytes(this.fdlgStudentPic.FileName);
                StudentPic = new Bitmap( this.fdlgStudentPic.FileName);
                StuInfo.StudentPic = imageBytes;
            }
            else
            {
                StudentPic = Properties.Resources.NoPhotoAvailable;
            }
        }
        catch (Exception)
        {
            MessageBox.Show("That was not a picture.", "Browse for picture");
            StudentPic = this.BrowseForPicture();
        }

        return StudentPic;
    }
0
MethodMan 1 Авг 2012 в 22:57
Поскольку я использую код в CompactFramework, я не могу использовать, например, File.ReadAllBytes. Вот почему я использую свою функцию ByteToImage, которая пока работает нормально.
 – 
Ignacio Gómez
1 Авг 2012 в 22:35