Следующий код дал мне высочайшее качество с сохранением пропорций. Пробовал несколько вещей и прочитал несколько статей, представленных здесь в других ответах. Потерял два дня, и в итоге я получил лучший результат с помощью простого Java-метода (попробовал также библиотеки ImageMagick и java-image-scaling):
public static boolean resizeUsingJavaAlgo(String source, File dest, int width, int height) throws IOException {
BufferedImage sourceImage = ImageIO.read(new FileInputStream(source));
double ratio = (double) sourceImage.getWidth()/sourceImage.getHeight();
if (width < 1) {
width = (int) (height * ratio + 0.4);
} else if (height < 1) {
height = (int) (width /ratio + 0.4);
}
Image scaled = sourceImage.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING);
BufferedImage bufferedScaled = new BufferedImage(scaled.getWidth(null), scaled.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bufferedScaled.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.drawImage(scaled, 0, 0, width, height, null);
dest.createNewFile();
writeJpeg(bufferedScaled, dest.getCanonicalPath(), 1.0f);
return true;
}
/**
* Write a JPEG file setting the compression quality.
*
* @param image a BufferedImage to be saved
* @param destFile destination file (absolute or relative path)
* @param quality a float between 0 and 1, where 1 means uncompressed.
* @throws IOException in case of problems writing the file
*/
private static void writeJpeg(BufferedImage image, String destFile, float quality)
throws IOException {
ImageWriter writer = null;
FileImageOutputStream output = null;
try {
writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
output = new FileImageOutputStream(new File(destFile));
writer.setOutput(output);
IIOImage iioImage = new IIOImage(image, null, null);
writer.write(null, iioImage, param);
} catch (IOException ex) {
throw ex;
} finally {
if (writer != null) {
writer.dispose();
}
if (output != null) {
output.close();
}
}
}
Большая часть вопроса не связана с siteflags .
См. « Написание дополнительных представлений », чтобы получить пример urls.py . Например, это может выглядеть как
path('videos/<int:bookmark_id>/', views.user_bookmarked_video, name='videos_bookmarked'),
Однако ваш bookmark_id вводит в заблуждение, поскольку это идентификатор видео, а не идентификатор закладки. Более того, ваш вид называется user_bookmarked_video () , но это не то, что он делает - он просто устанавливает флаг (закладку) для некоторого видеообъекта.
Если вы планируете использовать это представление просто для установки закладки, лучше назвать ее как set_video_bookmark () и перенаправить в конце функции вместо рендеринга html.
Если вы намеревались показать все видео с закладками для текущего пользователя, то нет необходимости принимать аргумент bookmark_id для вашего просмотра и отмечать его при каждом вызове представления.
Ваш html может выглядеть так, как вы хотите, в зависимости от того, что вы хотите увидеть. Например:
<h1>{{ video.name }}</h1>