2015-06-08 2 views
0

Я пытаюсь получить тип изображения из QImage как QString, вот код, я использую:получить тип изображения из QImage

QImageReader reader(filename); 
QByteArray filetype_ba = reader.format(); 
QString filetype_qs(filetype_ba); 

это работает. Но когда я переименую файл, например из image.png в image.jpg, он возвращает пустые значения. Означает ли это, что QImageReader читает имя файла, а не файл-файл? Я хочу получить тип изображения из заголовка, поэтому даже когда я переименую файл (не конвертировать), он все равно даст мне правильный тип.

+0

Вы только что переименовали файл или преобразовали его из png в jpg? – RedX

+0

просто переименовал его. – yangsunny

+0

какая точка линии 'QImage * image = new QImage (filename);'? – UmNyobe

ответ

0

QImageReader documentation specify the following steps:

  1. плагин Image опрашиваются первыми, либо на основе дополнительного формат строке или имени файла суффикс
  2. Если не плагин не поддерживает формат изображение, Qt встроенные обработчики проверяются на основе либо дополнительной строки форматирования, либо имени файла суффикс.
  3. Если нет доступных плагинов или встроенных обработчиков, каждый плагин проверяется путем проверки содержимого потока данных.
  4. Если никакие плагины не смогли обнаружить формат изображения на основе содержимого данных, каждый встроенный обработчик изображения проверяется путем проверки содержимого.
  5. Наконец, если все вышеприведенные подходы сбой, QImageReader сообщит об ошибке при попытке прочитать изображение.

Похоже, что обработчик соответствует расширению, и сказать: «Эй, я могу полностью прочитать, что» без проверки содержания, как вы предполагалось. И (хорошим) дизайном, обработчик jpeg должен обрабатывать только jpeg и ничего больше.

Вещь QImage ведет себя по-другому, так как она непосредственно смотрит в поток данных файла, чтобы угадать формат. Кажется, вы должны основывать свое обнаружение только на Qimage.

Примечание: Это описывает поведение по умолчанию, то есть такой же, как QImageReader::setAutoDetectImageFormat(true). false означает, что вы, программист, должны установить тип изображения самостоятельно, используя второй аргумент или другой метод.

+0

thats то, что я пробовал в первую очередь. Я просмотрел документацию QImage-Class от Qt, но не смог найти какие-либо методы для получения типа изображения из QImage напрямую (или я просто слеп) – yangsunny

+0

что-то нашел, но я понятия не имею, почему это (не) работает , Сначала я нашел 'QImageReader :: setAutoDetectImageFormat (bool enabled)' и установил для него значение false, но теперь я ничего не получаю от 'reader.format()', даже не оригинальных, которые я не переименовал. Затем я устанавливаю 'QImageReader :: setDecideFormatFromContent (bool ignored)' on ignored, что также отключает автоматическое определение формата изображения. С этим я всегда могу получить правильный тип изображения, но я не могу получить высоту и ширину с помощью 'QSize size = image-> size(); size.height(); size.width(); 'больше ... почему ??? – yangsunny