#image #embedded-resource #system.drawing #argumentexception
#изображение #встроенный-ресурс #system.drawing #исключение argumentexception
Вопрос:
Об этом только что сообщил пользователь. Эта часть программы была протестирована и использовалась в дикой природе довольно широко и не менялась в течение некоторого времени. Кажется, он работал для нее и только недавно начал давать сбой. Поскольку изображение поступает из ресурсов, его не нужно удалять. В моем тестировании (и при изучении кода) это всегда должно происходить в потоке пользовательского интерфейса, поэтому я предполагаю, что программа каким-то образом повреждена, что приводит к тому, что изображение в ресурсах фактически недействительно. Имеет ли это смысл или есть более правдоподобное объяснение. Вот стек вызовов:
Msg: Parameter is not valid.
Source: System.Drawing
Assembly: System.Drawing, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a
Stack: at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()
at System.Windows.Forms.PictureBox.GetPreferredSizeCore(Size
proposedSize)
at System.Windows.Forms.Control.GetPreferredSize(Size proposedSize)
at
System.Windows.Forms.Layout.TableLayout.GetElementSize(IArrangedElement
element, Size proposedConstraints)
at System.Windows.Forms.Layout.TableLayout.InflateColumns(ContainerInfo
containerInfo, Size proposedConstraints, Boolean measureOnly)
at System.Windows.Forms.Layout.TableLayout.ApplyStyles(ContainerInfo
containerInfo, Size proposedConstraints, Boolean measureOnly)
at System.Windows.Forms.Layout.TableLayout.LayoutCore(IArrangedElement
container, LayoutEventArgs args)
at System.Windows.Forms.Layout.LayoutEngine.Layout(Object container,
LayoutEventArgs layoutEventArgs)
at System.Windows.Forms.Control.OnLayout(LayoutEventArgs levent)
at System.Windows.Forms.ScrollableControl.OnLayout(LayoutEventArgs
levent)
at System.Windows.Forms.TableLayoutPanel.OnLayout(LayoutEventArgs levent)
at System.Windows.Forms.Control.PerformLayout(LayoutEventArgs args)
at
System.Windows.Forms.Control.System.Windows.Forms.Layout.IArrangedElement.PerformLayout(IArrangedElement
affectedElement, String affectedProperty)
at System.Windows.Forms.Control.PerformLayout(LayoutEventArgs args)
at
System.Windows.Forms.Control.System.Windows.Forms.Layout.IArrangedElement.PerformLayout(IArrangedElement
affectedElement, String affectedProperty)
at System.Windows.Forms.PictureBox.InstallNewImage(Image value,
ImageInstallationType installationType)
at System.Windows.Forms.PictureBox.set_Image(Image value)
at SayMore.Transcription.UI.OralAnnotationRecorderBaseDlg.UpdateDisplay()
at
SayMore.Transcription.UI.OralAnnotationRecorderBaseDlg.BeginRecording(TimeRange
timeRangeOfSourceBeingAnnotated)
at
SayMore.Transcription.UI.OralAnnotationRecorderBaseDlg.HandleRecordAnnotationMouseDown(Object
sender, MouseEventArgs e)
at
SayMore.Transcription.UI.OralAnnotationRecorderBaseDlg.OnLowLevelKeyDown(Keys
key)
at
SayMore.UI.LowLevelControls.MonitorKeyPressDlg.PreFilterMessage(Messageamp; m)
at System.Windows.Forms.Application.ThreadContext.ProcessFilters(MSGamp;
msg, Booleanamp; modified)
at
System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSGamp; msg)
at
System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage(MSGamp;
msg)
at
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr
dwComponentID, Int32 reason, Int32 pvLoopData)
at
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32
reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at SayMore.Model.Files.ComponentFile.RecordAnnotations(Form frm,
AudioRecordingType annotationType)
at
SayMore.Transcription.UI.TextAnnotationEditor.<>c_DisplayClassb.<HandleRecordedAnnotationButtonClick>b_a()
at
SayMore.Transcription.UI.TextAnnotationEditor.ShowSegmentationDialog(Action
showDialog)
at
SayMore.Transcription.UI.TextAnnotationEditor.HandleRecordedAnnotationButtonClick(Object
sender, EventArgs e)
at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e,
ToolStripItemEventType met)
at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e,
ToolStripItemEventType met)
at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.Control.WmMouseUp(Messageamp; m, MouseButtons
button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Messageamp; m)
at System.Windows.Forms.ScrollableControl.WndProc(Messageamp; m)
at System.Windows.Forms.ToolStrip.WndProc(Messageamp; m)
at System.Windows.Forms.ToolStripDropDown.WndProc(Messageamp; m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messageamp; m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messageamp; m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
И вот метод в нашем коде, в котором устанавливается изображение:
protected override void UpdateDisplay()
{
_recDeviceIndicator.UpdateDisplay();
_labelListenButton.Image = (_waveControl.IsPlaying amp;amp; _playingBackUsingHoldDownButton ?
Resources.ListenToOriginalRecordingDown : Resources.ListenToOriginalRecording);
_labelRecordButton.Image = (ViewModel.GetIsRecording() ?
Resources.RecordingOralAnnotationInProgress : Resources.RecordOralAnnotation);
_labelListenButton.Enabled = !ViewModel.GetIsRecording() amp;amp;
(ViewModel.CurrentUnannotatedSegment != null || !ViewModel.GetIsFullyAnnotated());
_labelRecordButton.Enabled = (ViewModel.GetSelectedSegmentIsLongEnough() amp;amp;
_userHasListenedToSelectedSegment amp;amp;
AudioUtils.GetCanRecordAudio(true) amp;amp;
!_waveControl.IsPlaying amp;amp; !ViewModel.GetIsAnnotationPlaying());
_labelListenHint.Visible = _spaceBarMode == SpaceBarMode.Listen amp;amp; _labelListenButton.Enabled;
_labelRecordHint.Visible = _spaceBarMode == SpaceBarMode.Record amp;amp; _labelRecordButton.Enabled amp;amp; !_reRecording amp;amp; _recordingErrorMessage == null;
if (_spaceBarMode == SpaceBarMode.Done amp;amp; _recordingErrorMessage == null)
{
if (!_labelFinishedHint.Visible)
{
_pictureIcon.Image = Resources.Green_check;
_labelFinishedHint.Visible = true;
_tableLayoutButtons.Controls.Add(_labelFinishedHint, 1, 0);
_tableLayoutButtons.SetRowSpan(_labelFinishedHint, 3);
AcceptButton = _buttonOK;
}
}
else
{
UdateErrorMessageDisplay();
if (_labelErrorInfo.Visible)
{
_pictureIcon.Image = Resources.Information_red;
if (_labelFinishedHint.Visible)
{
_labelFinishedHint.Visible = false;
_tableLayoutButtons.Controls.Remove(_labelFinishedHint);
}
_labelRecordHint.Visible = false;
}
else
{
_pictureIcon.Image = Resources.Information_blue;
}
float percentage = (_labelErrorInfo.Visible) ? 50 : 100;
_tableLayoutButtons.RowStyles[0].Height = (_labelErrorInfo.Visible) ? percentage : 0;
_tableLayoutButtons.RowStyles[1].Height = (_labelListenHint.Visible) ? percentage : 0;
_tableLayoutButtons.RowStyles[2].Height = (_labelRecordHint.Visible) ? percentage : 0;
}
base.UpdateDisplay();
}
Я не уверен, какой из вызовов для установки изображения вызывает исключение, но, исходя из контекста, я подозреваю, что это where _labelRecordButton .Изображение устанавливается на ресурсы.Запись или аннотация в процессе. Дело в том, что в каждом случае изображение поступает только из ресурсов, поэтому оно всегда должно быть действительным.
Комментарии:
1. Только что обнаружил аналогичную ошибку «Параметр недопустим» в строке `decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions. Сохранитьpixelformat, BitmapCacheOption . OnLoad); ` Функция, содержащая строку, вызывается повторно (для разных изображений), и сбой происходит после переменного количества вызовов, но быстрее с большими изображениями, что подразумевает проблему с памятью. Однако мониторинг с помощью диспетчера задач не показывает систематического увеличения использования памяти при повторных вызовах.
2. Удален вызов JpegBitmapDecoder, но все же иногда возникает та же ошибка при создании растрового изображения из файла, проверенного с помощью Resource Monitor, который не показал никаких необычных особенностей в распределении памяти, когда произошел сбой. Сбои происходят чаще, когда из приложений, таких как браузеры, выделяется много памяти с множеством открытых вкладок, и когда приложение обрабатывает большие изображения, когда оно выделяет больше памяти. Так что это пахнет как проблема с памятью, но диагностика этого не поддерживает.
Ответ №1:
Может быть что угодно. Известно, что класс Bitmap генерирует исключения любого типа для ошибок любого типа, поэтому причина проблемы не может быть выведена из типа исключения. Я предполагаю, что это будет состояние нехватки памяти.