java:更快更好地缩放图象
protected void paintComponent(Graphics g) {
// Scale with NEAREST_NEIGHBOR
int xLoc = PADDING, yLoc = PADDING;
long startTime, endTime;
float totalTime;
int iterations = 10;
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
startTime = System.nanoTime();
for (int i = 0; i < iterations; ++i) {
g.drawImage(picture, xLoc, yLoc, scaleW, scaleH, null);
}
endTime = System.nanoTime();
totalTime = (float)((endTime - startTime) / 1000000) / iterations;
g.drawString("NEAREST ", xLoc, yLoc + scaleH + PADDING);
g.drawString(Float.toString(totalTime) + " ms",
xLoc, yLoc + scaleH + PADDING + 10);
System.out.println("NEAREST: " + ((endTime - startTime) / 1000000));
// Scale with BILINEAR
xLoc += scaleW + PADDING;
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
startTime = System.nanoTime();
for (int i = 0; i < iterations; ++i) {
g.drawImage(picture, xLoc, yLoc, scaleW, scaleH, null);
}
endTime = System.nanoTime();
totalTime = (float)((endTime - startTime) / 1000000) / iterations;
g.drawString("BILINEAR", xLoc, yLoc + scaleH + PADDING);
g.drawString(Float.toString(totalTime) + " ms",
xLoc, yLoc + scaleH + PADDING + 10);
System.out.println("BILINEAR: " + ((endTime - startTime) / 1000000));
// Scale with BICUBIC
xLoc += scaleW + PADDING;
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
startTime = System.nanoTime();
for (int i = 0; i < iterations; ++i) {
g.drawImage(picture, xLoc, yLoc, scaleW, scaleH, null);
}
endTime = System.nanoTime();
totalTime = (float)((endTime - startTime) / 1000000) / iterations;
g.drawString("BICUBIC", xLoc, yLoc + scaleH + PADDING);
g.drawString(Float.toString(totalTime) + " ms",
xLoc, yLoc + scaleH + PADDING + 10);
System.out.println("BICUBIC: " + ((endTime - startTime) / 1000000));
// Scale with getScaledInstance
xLoc += scaleW + PADDING;
startTime = System.nanoTime();
for (int i = 0; i < iterations; ++i) {
Image scaledPicture = picture.getScaledInstance(scaleW, scaleH,
Image.SCALE_AREA_AVERAGING);
g.drawImage(scaledPicture, xLoc, yLoc, null);
}
endTime = System.nanoTime();
totalTime = (float)((endTime - startTime) / 1000000) / iterations;
g.drawString("getScaled", xLoc, yLoc + scaleH + PADDING);
g.drawString(Float.toString(totalTime) + " ms",
xLoc, yLoc + scaleH + PADDING + 10);
System.out.println("getScaled: " + ((endTime - startTime) / 1000000));
// Scale with Progressive Bilinear
xLoc += scaleW + PADDING;
startTime = System.nanoTime();
for (int i = 0; i < iterations; ++i) {
Image scaledPicture = getFasterScaledInstance(picture, scaleW, scaleH,
RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);
g.drawImage(scaledPicture, xLoc, yLoc, null);
}
endTime = System.nanoTime();
totalTime = (float)((endTime - startTime) / 1000000) / iterations;
g.drawString("Progressive", xLoc, yLoc + scaleH + PADDING);
g.drawString(Float.toString(totalTime) + " ms",
xLoc, yLoc + scaleH + PADDING + 10);
System.out.println("Progressive: " + ((endTime - startTime) / 1000000));
}