Java сжать файл изображения до целевого размера файла

Рабочий пример для Турции, просто измените

d{9}

в соответствии с вашими потребностями и начните использовать его.

function validateMobile($phone)
{
    $pattern = "/^(05)\d{9}$/";
    if (!preg_match($pattern, $phone))
    {
        return false;
    }
    return true;
}

$phone = "0532486061";

if(!validateMobile($phone))
{
    echo 'Incorrect Mobile Number!';
}

$phone = "05324860614";
if(validateMobile($phone))
{
    echo 'Correct Mobile Number!';
}
0
задан jeffer son 24 March 2019 в 19:24
поделиться

2 ответа

Как мне этого добиться?

Три большие опции:

  • Уменьшение разрешения (ширина и высота)
  • [111 ] Уменьшите качество JPEG (значение 0-100, которое вы используете при сжатии растрового изображения в JPEG)
  • Уменьшите битовую глубину (например, с ARGB888 до RGB565), хотя это в основном что-то для PNG и я подозреваю действительно испортит качество вашей фотографии

Есть ли способ рассчитать, какой должна быть ширина и высота для достижения целевого размера файла?

Нет, как это в значительной степени зависит от содержимого изображения и от того, насколько хорошо оно сжимается с использованием алгоритмов сжатия JPEG.

Или, еще лучше, уменьшить его без указания ширины и высоты?

Для получения размера от 3-4 МБ до 1 МБ почти гарантировано, что вам потребуется уменьшить разрешение.

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

0
ответ дан CommonsWare 24 March 2019 в 19:24
поделиться

Я сделал это около 15 лет назад, используя Swing и javax.image, и единственное жизнеспособное решение состояло в том, чтобы применить различные уровни качества к кодировщику JPG, чтобы найти наилучшую настройку качества, для которой изображение было все еще меньше, чем запрошенный максимальный размер. Код работал примерно так (код, синтезированный из реального кода, никогда не тестировался в этой версии ...):

/** Create JPG version of some image with given JPG quality setting (0..1), helper method */  
private byte[] createResultBytes(BufferedImage losslessimage,float lossyquality) {
  Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("JPG");
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  if (iter.hasNext()) {
    ImageWriter writer = iter.next();
    ImageWriteParam iwp = writer.getDefaultWriteParam();
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    iwp.setCompressionQuality(lossyquality);

    MemoryCacheImageOutputStream mcios = new MemoryCacheImageOutputStream(baos);
    writer.setOutput(mcios);

    // workaround for alpha-channel problems with lossy images: Seems to be non-functional for some pictures, anyway.
    BufferedImage img2=new BufferedImage(losslessimage.getWidth(),losslessimage.getHeight(),BufferedImage.TYPE_INT_RGB);
    Graphics g=img2.getGraphics();
    g.drawImage(new ImageIcon(losslessimage).getImage(),0,0,null);
    g.dispose();
    IIOImage iioimg = new IIOImage(img2, null, null);
    try {
      writer.write(null, iioimg, iwp);
      mcios.close();
    }
    catch (IOException ioe) {}
  }
  return baos.toByteArray();
}

/** Create JPG version of some image with best JPG quality where the file size is still not larger than maxsize. */
public byte[] getLossyImage(BufferedImage losslessimage,int maxsize,float maxquality) {
  byte[] resultbytes=createResultBytes(losslessimage,maxquality);
  if (resultbytes.length>size) {
    int minsize=(int)(size*.9f);
    float newq=maxquality/2f;
    resultbytes=createResultBytes(losslessimage,newq);
    float qdiff=newq/2f;
    while ((resultbytes.length<minsize || resultbytes.length>size) &&  diff>.02f) {
      newq+=(resultbytes.length<minsize?qdiff:-qdiff);
      resultbytes=createResultBytes(losslessimage,newq);
      qdiff=qdiff/2f;
    }
  }
  return resultbytes;
}

Обратите внимание, что я изменил размер файла только с помощью настройки качества JPG, а не с помощью автоматического изменения размер изображения. Если вы хотите пойти по этому пути, вы должны сначала применить эти изменения размера.

0
ответ дан Dirk Hillbrecht 24 March 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: