Необъяснимое предупреждение при чтении файла «.bmp» в Matlab GUIDE

Я написал файл Matlab (.m) для выполнения стегографии для моего проекта последнего года обучения.

Я разработал графический интерфейс для проекта, используя GUIDE в Matlab.

Программа отлично работает при запуске в режиме сценария, но выдает следующую ошибку, когда я запускаю ее в режиме GUIDE:

Предупреждение. Каталог файлов изображений со смещением 38 не имеет записей и был проигнорирован.

Может ли кто-нибудь помочь мне с этим?


person Aneesh K    schedule 21.03.2014    source источник


Ответы (1)


BMP-файл? файла JPG/TIFF?

Мне кажется, у вас поврежден заголовок изображения; см. также эту тему на MATLAB Answers.

Вы можете использовать простую warning('off', warnId);, чтобы подавить предупреждение, потому что это не влияет на правильное функционирование вашей программы, но может запутать ваших пользователей.

Лично я бы не стал скрывать предупреждение, а сформулировал его так:

%// do your operations here

%// directly after the operation issuing the warning, do this: 
[warnMsg,warnID] = lastwarn;
if strcmpi(warnID, 'known_ID_of_your_warning')
    warndlg(...
        getReport(MException(warnID,warnMsg), 'extended', 'hyperlinks', 'on'), ...
        'Possible file corruption detected'); 
end 

Это выглядит намного более профессионально, но по-прежнему предупреждает ваших пользователей о любых потенциальных проблемах, которые просто не зависят от приложения.

ПРИМЕЧАНИЕ. Я не знаю подробностей, но в некоторых ситуациях этот подход может дать сбой (например, может быть выдано более одного предупреждения, но они внутренне подавлены (см. почему это плохая практика?)) В таком случае lastwarn нельзя доверять. Затем вам нужно будет использовать следующую (недокументированную) конструкцию:

%// change warning into error...
warnSts = warning('error', warnID);

%// ...so that it can be caught:
try

    %// ... do operations here

catch ME
    warndlg(...
        getReport(ME, 'extended', 'hyperlinks', 'on'), ...
        'Possible file corruption detected'); 
end
warning(warnSts);

Проблема в том, что выполнение бросающего приложения останавливается сразу после выдачи предупреждения; операция завершается преждевременно и, таким образом, не завершает свою задачу. Итак, вам нужно сделать следующее внутри catch:

  • подавить предупреждение:

    warning(warnSts);    
    warnSts = warning('off', warnID);
    
  • повторить операцию метания

  • повторить все операции, которые должны следовать за ним

Что далеко от идеала, поэтому, если вообще можно избежать, используйте первый метод. Просто поэкспериментируйте немного и найдите то, что соответствует вашим потребностям.

person Rody Oldenhuis    schedule 21.03.2014
comment
@AneeshK: изображения нет, но заголовок, похоже, есть. - person Rody Oldenhuis; 21.03.2014
comment
@AneeshK: В конце концов, вам решать, хотите ли вы беспокоить своих пользователей этой информацией. Большинство браузеров и программ для отображения изображений не беспокоят, но более профессиональные приложения, безусловно, беспокоят. - person Rody Oldenhuis; 21.03.2014
comment
Спасибо за очень информативный ответ. Я попробую с другим форматом файла и опубликую свой опыт. Я не понял вашего вопроса 'Файл BMP? файла JPG/TIFF?' - person Aneesh K; 21.03.2014