Я получаю от сокета 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, и теперь он это показывает. Не знаю, почему это происходит, но теперь все работает нормально.
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;
}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
imageBytes
?