d*r 发帖数: 238 | 1 当我有一些jpg文件,Dimension 是800x600,我要用1024x768来显示的时候,有些图像的
边缘就出现锯齿。
我不知道用什么方法能去掉这些锯齿。
我用了Graphics2D和AffineTransform的scale() function.
如果用C#的PictureBox就没有任何锯齿出现。 | F****n 发帖数: 3271 | 2 直接用Graphics2D的Transform会把所有细节放大, 当然会有剧齿,
你自己CREATE 一个SCALED的IMAGE不就行了.
的
【在 d*r 的大作中提到】 : 当我有一些jpg文件,Dimension 是800x600,我要用1024x768来显示的时候,有些图像的 : 边缘就出现锯齿。 : 我不知道用什么方法能去掉这些锯齿。 : 我用了Graphics2D和AffineTransform的scale() function. : 如果用C#的PictureBox就没有任何锯齿出现。
| d*r 发帖数: 238 | 3 If I know how to do that, I would not be here asking.
//sigh.
书到用是方狠少。
像
【在 F****n 的大作中提到】 : 直接用Graphics2D的Transform会把所有细节放大, 当然会有剧齿, : 你自己CREATE 一个SCALED的IMAGE不就行了. : : 的
| F****n 发帖数: 3271 | 4 同学, 不是我说你, 为什么不看看API呢? Image这个类本身就实现了SCALE的算法.
图
【在 d*r 的大作中提到】 : If I know how to do that, I would not be here asking. : //sigh. : 书到用是方狠少。 : : 像
| d*r 发帖数: 238 | 5 I tried Image.getScaledInstance() and use Image.SCALE_SMOOTH as parameter. But
it is too slow.
些
【在 F****n 的大作中提到】 : 同学, 不是我说你, 为什么不看看API呢? Image这个类本身就实现了SCALE的算法. : : 图
| F****n 发帖数: 3271 | 6 首先, 这取绝于你的目的到底是什么, 如果你就是想ZOOM IN/OUT而不对IMAGE进行修改,
那么800/600放到1024/768肯定有锯齿, 没有剧齿才是不正确的, 用AffineTransform就行
了,
如果你想修改IMAGE, 那么必然要CREATE一个SCALED的INSTANCE, 肯定会有一些计算, 会
花一些处理时间, 但也是正常的, JAVA一般在这些地方不会比C慢.
But
有
【在 d*r 的大作中提到】 : I tried Image.getScaledInstance() and use Image.SCALE_SMOOTH as parameter. But : it is too slow. : : 些
| B******N 发帖数: 445 | 7 you are wrong, it's better not create scale instance, which will be very slow.
the correct answer:
BufferedImage targetImage = new BufferedImage(targetWidth,
targetHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = targetImage.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage(srcImage, 0, 0, targetWidth, targetHeight, null);
g2d.dispose();
you will get much fa
【在 F****n 的大作中提到】 : 首先, 这取绝于你的目的到底是什么, 如果你就是想ZOOM IN/OUT而不对IMAGE进行修改, : 那么800/600放到1024/768肯定有锯齿, 没有剧齿才是不正确的, 用AffineTransform就行 : 了, : 如果你想修改IMAGE, 那么必然要CREATE一个SCALED的INSTANCE, 肯定会有一些计算, 会 : 花一些处理时间, 但也是正常的, JAVA一般在这些地方不会比C慢. : : But : 有
| F****n 发帖数: 3271 | 8 Don't know what your talking about,
你难道不是在建立一个SCALED INSTANCE????
slow.
改
用AffineTransform就
parameter.
法.
候
【在 B******N 的大作中提到】 : you are wrong, it's better not create scale instance, which will be very slow. : the correct answer: : BufferedImage targetImage = new BufferedImage(targetWidth, : targetHeight, BufferedImage.TYPE_INT_RGB); : Graphics2D g2d = targetImage.createGraphics(); : g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, : RenderingHints.VALUE_INTERPOLATION_BILINEAR); : g2d.drawImage(srcImage, 0, 0, targetWidth, targetHeight, null); : g2d.dispose(); : you will get much fa
| F****n 发帖数: 3271 | 9 总之取决与需要, 可能会有三种情况:
1. 象MS PAINT那样忠实反映相素的, 用AffineTransform;
2. 象HTML上那样的只要任意大小的显示的, 直接用Graphics drawImage;
3. 要Edit就必需create 新的 scaled instance.
修
算,
算
时
【在 F****n 的大作中提到】 : Don't know what your talking about, : 你难道不是在建立一个SCALED INSTANCE???? : : slow. : 改 : 用AffineTransform就 : parameter. : 法. : 候
| B******N 发帖数: 445 | 10 thanks.
the algorithm used by getScaleInstance() is much slower than g2d draw, also
use a lot of memory. It could be the reason it's pure java calculation. the
g2d is calling native method.
行
计
的 |
|