Кто-нибудь предложил что-то подобное? Просто идея для горизонтального меню ...
часть HTML
часть CSS
/* hide parent backgrounds... */
.parent-background {
display: none; }
/* ... and show it when hover on children */
.item:hover + .parent-background {
display: block;
position: absolute;
z-index: 10;
top: 0;
width: 100%; }
Обновлено демо и остальные кода
Другой пример , как использовать его с текстовыми вводами - выберите родительский набор полей
Лучшая статья, которую я когда-либо читал по этой теме, - . Perils of Image.getScaledInstance () (веб-архив).
Вкратце: вам нужно использовать несколько изменений размера шаги, чтобы получить хорошее изображение. Вспомогательный метод из статьи:
public BufferedImage getScaledInstance(BufferedImage img,
int targetWidth,
int targetHeight,
Object hint,
boolean higherQuality)
{
int type = (img.getTransparency() == Transparency.OPAQUE) ?
BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage ret = (BufferedImage)img;
int w, h;
if (higherQuality) {
// Use multi-step technique: start with original size, then
// scale down in multiple passes with drawImage()
// until the target size is reached
w = img.getWidth();
h = img.getHeight();
} else {
// Use one-step technique: scale directly from original
// size to target size with a single drawImage() call
w = targetWidth;
h = targetHeight;
}
do {
if (higherQuality && w > targetWidth) {
w /= 2;
if (w < targetWidth) {
w = targetWidth;
}
}
if (higherQuality && h > targetHeight) {
h /= 2;
if (h < targetHeight) {
h = targetHeight;
}
}
BufferedImage tmp = new BufferedImage(w, h, type);
Graphics2D g2 = tmp.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
g2.drawImage(ret, 0, 0, w, h, null);
g2.dispose();
ret = tmp;
} while (w != targetWidth || h != targetHeight);
return ret;
}
Да, у меня были те же проблемы и они были решены, пожалуйста, прочитал мой вопрос (ответ вставлен в вопрос). Я попробовал библиотеки imgscalr и java-image-scaling и нашел второе гораздо лучшее качество. Подходите к монитору, чтобы оценить разницу между примерами миниатюр.
Несмотря на мои первоначальные мысли, изменение размера изображения кажется очень сложным, вы не хотите делать это самостоятельно. Например, я скажу java-image-scaling , чтобы использовать ResampleFilters.getLanczos3Filter()
для получения лучшего результата.
В нем также рассматриваются способы сохранения JPG с качеством, превышающим стандартное значение 75, который создает плохой результат, особенно для миниатюры.
Я также написал небольшой класс, называемый MyImage
, чтобы помочь с обычными задачами, такими как чтение изображения из массива байтов , из файла, масштабирование, задавая только ширину или только высоту, масштабирование, задавая ограничивающий прямоугольник, масштабируя, задавая ширину и высоту и добавляя белую полосу, чтобы изображение не искажалось и записывалось в файл JPG.
Все методы, которые вы указали, не работают для меня, мне нужно уменьшить размер QrCode, но с помощью вышеописанных методов качество плохое, а сканер не работает, если я беру исходное изображение и изменяю его размер в краске, который работает сканер.
Ни один из ответов не поможет вам получить реальное качество, которое вы желаете. Включите файл thumbailator.jar в свой проект (загрузите его здесь):
https://code.google.com/p/thumbnailator/
https://code.google.com/p/thumbnailator/wiki/Downloads?tm=2
Затем сначала загрузите изображение (как файл, без Thumbnailator - его использование - создавать большие пальцы, но вы можете создавать большие изображения с ним, конечно), и изменять его размер до любых размеров, которые вы хотите (например, с Thumbnailator 800x600). Качество будет очень хорошим. Я искал это долгое время, этот .jar помог мне достичь того, чего я хочу.
Если ваш источник изображения является png
, используйте следующие функции:
Image imgSmall = imgBig.getScaledInstance(
targetWidth, targetHeight, Image.SCALE_SMOOTH);
Если вы хотите изменить размер jpeg или gif без лишнего качества, я создал библиотеку в 2010 году для этого: beautylib on github , который использует внутренне эту другую библиотеку: java-image-scaling . Вы можете непосредственно увидеть исходный код, чтобы найти что-то полезное: https://github.com/felipelalli/beautylib/blob/master/src/br/eti/fml/beautylib/ResizeImage.java
Знаю, что вопрос старый ... Я пробовал разные решения, занимаясь серфингом, затем веб, я получил лучший результат, используя getScaledInstance()
, поставляя Image.SCALE_SMOOTH
в качестве аргумента. На самом деле качество изображения было действительно лучше. Мой код ниже:
final int THUMB_SIDE = 140;
try {
BufferedImage masterImage = ImageIO.read(startingImage);
BufferedImage thumbImage = new BufferedImage(THUMB_SIDE, THUMB_SIDE, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = thumbImage.createGraphics();
g2d.drawImage(masterImage.getScaledInstance(THUMB_SIDE, THUMB_SIDE, Image.SCALE_SMOOTH), 0, 0, THUMB_SIDE, THUMB_SIDE, null);
g2d.dispose();
String thumb_path = path.substring(0, path.indexOf(".png")) + "_thumb.png";
ImageIO.write(thumbImage, "png", new File(thumb_path));
} catch (IOException e) {
e.printStackTrace();
}
Следующий код дал мне высочайшее качество с сохранением пропорций. Пробовал несколько вещей и прочитал несколько статей, представленных здесь в других ответах. Потерял два дня, и в итоге я получил лучший результат с помощью простого 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();
}
}
}
Ответ: Удалите подсказки VALUE_INTERPOLATION_BILINEAR и VALUE_RENDERING_QUALITY.
Пример:
public static BufferedImage resizeImage(BufferedImage image, int width, int height) {
// Temporary image
BufferedImage tmp = image;
// Result image
BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// Graphics object
Graphics2D graphics = (Graphics2D)result.createGraphics();
// Add rendering hints
graphics.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
graphics.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
// Draw tmp
graphics.drawImage(tmp, 0, 0, width, height, null);
// Dispose of graphics object
graphics.dispose();
// Return image result
return result;
}
Примечание. : По какой-то причине подсказки VALUE_INTERPOLATION_BILINEAR и VALUE_RENDERING_QUALITY размывают изменение размера изображения.