bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Сжать размер изображения?

Здравствуйте. Подскажите пожалуйста. Как лучше всего сделать, делаю мини редактор для изображения (поворот, фильтры, смещение).

5c52b0be850f7704121421.png

И нужно что бы предварительно отображалось изображения в размере 1024 х AUTO.
Так вот вопрос как лучше это сделать?
1) Сразу как-то сжать изображение под необходимый размер и сохранить это состояние? А далее работать с ним.
2) Или изначально работать с исходным изображениям, добавляя к нему коэффициент сжатия?

Вот исходный код программы.
renderImage() {
      const {
        image, canvas, context,
        scale, offsetX, offsetY, rotate,
        contrast, brightness, balanceColor
      } = this;

      const canvasSize = canvas.clientWidth;
      const centerSize = canvasSize / 2;
      canvas.width = canvasSize;
      canvas.height = canvasSize;

      // Clear canvas
      context.clearRect(0, 0, canvasSize, canvasSize);
      context.save();

      // Фильтры - яркость и контрасность
      let filter = '';
      filter += ` contrast(${contrast})`;
      filter += ` brightness(${brightness})`;
      context.filter = filter;

      // Вращение изображения
      let offsetRotate = 0;
      if (rotate) {
        offsetRotate = centerSize;
        context.translate(offsetRotate, offsetRotate);
        context.rotate(rotate * Math.PI / 180);
      }

      // Маштабирование
      const scaleKoef = (10 + scale) / 10;
      const scaleSize = canvasSize / scaleKoef * Math.sqrt(2);

      // Смещение изображения
      const offsetXMain = -offsetX * image.width / 100 * scaleKoef;
      const offsetYMain = -offsetY * image.height / 100 * scaleKoef;

      context.drawImage(
        image,
        offsetXMain, offsetYMain, scaleSize, scaleSize,
        -offsetRotate, -offsetRotate, canvasSize, canvasSize
      );

      // Делаем картинку черно-белой
      const imageData = context.getImageData(0, 0, canvasSize, canvasSize);

      const balanceColorKoef = 122.5 + balanceColor * 1.225;
      for (let i = 0; i < imageData.data.length; i += 4) {
        const red = imageData.data[i];
        const green = imageData.data[i + 1];
        const blue = imageData.data[i + 2];
        const alpha = imageData.data[i + 3];

        const isWhite = ((red + green + blue) / 3) > balanceColorKoef || alpha < balanceColorKoef;

        const color = isWhite ? 255 : 0;

        imageData.data[i] = color;
        imageData.data[i + 1] = color;
        imageData.data[i + 2] = color;

        if (alpha !== 255) imageData.data[i + 3] = 255;
      }

      context.putImageData(imageData, 0, 0);

      // Берем картинку в кружочек и белый фон позади кружочка
      context.restore();
      context.globalCompositeOperation = 'destination-in';
      context.arc(centerSize, centerSize, centerSize, 0, 2 * Math.PI);
      context.fill();

      context.globalCompositeOperation = 'destination-over';
      context.rect(0, 0, canvasSize, canvasSize);
      context.fillStyle = 'white';
      context.fill();
    }


Спасибо.
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ответы на вопрос 1
@GreatRash
Работать с исходным, а отрисовывать маленькое.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы