ActionScript 3 Качество чтения JPEG - PullRequest
2 голосов
/ 24 марта 2010

Я разрабатываю загрузчик изображений для Flash 10. Есть ли способ прочитать качество JPEG просматриваемых изображений.

Ответы [ 2 ]

1 голос
/ 25 марта 2010

К сожалению, это нельзя сделать напрямую:

Коэффициент качества не сохраняется непосредственно в файле JPEG, так что вы не может прочитать показатель качества из файл. (из: Поддержка Microsoft страниц ...)

Более подробно:

Таблица квантования, которая использовалась сжать изображение хранится в заголовок JFIF, но качество JPEG Фактор, который был использован для генерации таблица квантования не хранится вместе с изображением и, следовательно, оригинал Коэффициент качества JPEG теряется. (от: Метрики сжатия JPEG как качественное транскодирование с учетом качества изображения , Сурендар Чандра и Карла Шлаттер Эллис)

Приведенная выше цитата взята из статьи, в которой обсуждаются способы оценки уровня сжатия (путем изучения таблиц квантования, использованных на изображении), но это не выглядит легким для реализации: есть пример здесь , который является частью Image Magick кодовой базы, но написан на C.

Image Magick был портирован на Haxe , который может быть встроен во Flash-код, поэтому возможно, что вы могли бы заставить что-то работать, но я боюсь, что это не в моих силах объяснить как!


РЕДАКТИРОВАТЬ: только что нашел аналогичный вопрос в SuperUser, который также упоминает Image Magick.


РЕДАКТИРОВАТЬ: вас также могут заинтересовать ответы на этот вопрос , в котором задается вопрос о том, как получить размер изображения без загрузки всего файла (хорошо для работы с изображениями, размер которых превышает возможности Flash) .

0 голосов
/ 21 апреля 2016

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

#include <stdio.h>
#include <math.h>

#include "jpeglib.h"
#include <setjmp.h>

static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
  16,  11,  10,  16,  24,  40,  51,  61,
  12,  12,  14,  19,  26,  58,  60,  55,
  14,  13,  16,  24,  40,  57,  69,  56,
  14,  17,  22,  29,  51,  87,  80,  62,
  18,  22,  37,  56,  68, 109, 103,  77,
  24,  35,  55,  64,  81, 104, 113,  92,
  49,  64,  78,  87, 103, 121, 120, 101,
  72,  92,  95,  98, 112, 100, 103,  99
};

int ReadJpegQuality(const char *filename)
{
  FILE * infile = fopen(filename, "rb");
  fseek(infile,0,SEEK_END);
  size_t sz = ftell(infile);
  fseek(infile,0,SEEK_SET);
  unsigned char* buffer = new unsigned char[sz];
  fread(buffer,1,sz,infile);
  fclose(infile);
  struct jpeg_decompress_struct cinfo;
  struct jpeg_error_mgr jerr;
  cinfo.err = jpeg_std_error(&jerr);
  jpeg_create_decompress(&cinfo);
  jpeg_mem_src(&cinfo,(unsigned char*)buffer,sz);
  jpeg_read_header(&cinfo, TRUE);
  int tmp_quality = 0;
  int linear_quality = 0;
  const int aver_times = 3;
  int times = 0;
  int aver_quality = 0;
  for(int i=0;i<DCTSIZE2;i++)
  {
    long temp = cinfo.quant_tbl_ptrs[0]->quantval[i];
    if(temp<32767L&&temp>0)
    {
      linear_quality = ceil((float)(temp*100L - 50L)/std_luminance_quant_tbl[i]);
      if(linear_quality==1) tmp_quality = 1;
      else if(linear_quality==100) tmp_quality = 100;
      else if(linear_quality>100)
      {
        tmp_quality = ceil((float)5000/linear_quality);
      }
      else
      {
        tmp_quality = 100 - ceil((float)linear_quality/2);
      }
      aver_quality += tmp_quality;
      if(aver_times==++times)
      {
        aver_quality /= aver_times;
        break;
      } 
    }
  }
  jpeg_destroy_decompress(&cinfo);
  return aver_quality;
}

int main(int argc,char** argv)
{
  printf("quality: %d\n",ReadJpegQuality("test1.jpg"));
  return 0; 
}

этот метод использует libjpeg для чтения таблицы квантования jpg файла, а затем с помощью таблицы квантования вычисляет аргументы качества.

...