我是一位经验丰富的Java程序员,但对Java2D来说相对较新.我正在尝试缩放图像但我的质量结果质量很差.图像是面板的预览,因此包含文本和文本字段等内容.我将永远缩小规模,永不升级.
目前我正在使用以下代码: -
g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
Run Code Online (Sandbox Code Playgroud)
其中panelImage是全尺寸预览(BufferedImage),scaledWidth和scaledHeight是相应的目标尺寸.我似乎在文本和文本字段等边缘丢失了很多细节.
我应该使用更好的电话来缩放图像吗?
谢谢,约翰
有没有办法在java中绘制烟雾效果(通过使用Java2D API).我想实现这一点:当用户提供烟雾的颜色时,程序会自动使用该颜色绘制烟雾效果.我怎么能这样做?
我正在用g.drawString(str, x, y)一个Graphics2D对象绘制一个String g.当前的字体g不包括所有字符str(我在那里有例如中文字符).在Mac OS X上,似乎会自动使用后备字体,但不会在Windows上显示黑色方形轮廓,而不是所需的字符.
(例如,那里有一个很好的字体.)
更新/更多信息
因此,不支持所有字符的原始字体不是JVM的逻辑字体之一,而是我的应用程序随附的捆绑字体Font.createFont().因此,将字体添加到JRE的lib/fonts/fallback文件夹在此处不起作用.
灵感来自数学网站的大麻方程式(它指的是Wolfram Research Cannabis Curve),我想知道..我们如何使用Java-2D绘制这条曲线?
我正在使用这里JScrollNavigator描述的组件,以便为我嵌入的大型"画布式"CAD组件提供导航窗口.JScrollPane
我已经尝试调整JScrollNavigator绘制画布的缩略图以向用户提供一些额外的上下文.但是,执行此操作会导致应用程序主框架的呈现损坏.具体来说,它是调用paint(Graphics)视口组件(即我的主画布)的动作,传入由此Graphics创建的对象BufferedImage导致后续显示损坏; 如果我评论这一行,一切正常.
以下是JScrollNavigator被覆盖的paintComponent方法:
@Override
protected void paintComponent(Graphics g) {
Component view = jScrollPane.getViewport().getView();
BufferedImage img = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
// Paint JScrollPane view to off-screen image and then scale.
// It is this action that causes the display corruption!
view.paint(g2d);
g2d.drawImage(img, 0, 0, null);
Image scaled = img.getScaledInstance(getWidth(), getHeight(), 0);
super.paintComponent(g);
g.drawImage(scaled, 0, 0, null);
}
Run Code Online (Sandbox Code Playgroud)
有没有人对腐败的原因有任何建议?我原本以为绘画到幕外图像应该对现有的绘画操作没有影响.
编辑 …
我正在尝试使用swing来强调字符串中的一个作品.
建议我使用以下代码的HTML:
Graphics2D g2 = (Graphics2D) g;
g.drawString("this is something I want people to <p color="#00FF00">NOTICE</p>", x, y);
Run Code Online (Sandbox Code Playgroud)
我试过这个,但没有运气......它只是输出HTML
谁能指出我正确的方向?
我想将大图像(18000 x 18000)加载到我的应用程序中.如果我使用BufferedImage类型int_rgb,我需要大约1235mb的堆内存来加载.这是一个非常大的内存量,最终用户可能会有更少的内存(1GB或更少).
在我的开发PC上,当我从MyEclipse IDE加载图像时,它会抛出内存不足Exception.当我将我的代码打包到一个可执行jar并在Eclipse外部的PC上运行时,它仍然会抛出异常.
如何在不使用1235mb内存的情况下使用缓冲图像将如此大的图像加载到我的应用程序中?有没有一个技巧,比如将图像分成像图像分割这样的较小部分?
我在SO上找到了这个帖子,但它对我没用; 我想加载图像BufferedImage,然后Panel使用Graphics该类绘制它.
(使用java 8)鉴于图像用户需要能够以像素为单位指定最小/最大图像大小,并且还需要以kbs为单位指定已保存图像的最大大小,图像将保存为jpg.
所以我通过调整缓冲图像的大小来完成第一个工作:
public static BufferedImage resizeUsingImageIO(Image srcImage, int size)
{
int w = srcImage.getWidth(null);
int h = srcImage.getHeight(null);
// Determine the scaling required to get desired result.
float scaleW = (float) size / (float) w;
float scaleH = (float) size / (float) h;
MainWindow.logger.finest("Image Resizing to size:" + size + " w:" + w + ":h:" + h + ":scaleW:" + scaleW + ":scaleH" + scaleH);
//Create an image buffer in which to paint on, create as an opaque …Run Code Online (Sandbox Code Playgroud) 我有一个自定义Icon其使用TexturePaint的油漆,并调用fillPolygon一个上Graphics2D对象.
这段代码在JDK6和JDK7上运行良好,但在64位Linux的JDK8下失败(在64位Linux上尝试了最新的JDK1.8).在Windows上,这适用于JDK8.
java -version用于重现问题的JDK命令的输出.
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)
重现问题的代码:
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class TexturePaintIconTest {
private static class CustomIcon implements Icon{
private static final int[] sXArray = new int[]{2, 5, 7, 12, 12, 4, 1, 1, 2};
private static final int[] sYArray = new int[]{4, 4, 2, 2, 11, 11, 8, 5, 4}; …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Swing作为我的主要绘图组件开发2D Java游戏.每个对象都有一个阴影(BufferedImage),但每个阴影都与其他阴影重叠.是否可以只让阴影不相互重叠?因为如果物体在它下面,我仍然希望阴影在玩家上方绘制,而不是如果物体在玩家之上.为清晰起见,这是一张图片:

我看过alpha合成,我想我需要Source Out?我还想过让所有阴影(没有透明度)在一个图层上绘制,然后用透明度绘制它,然后它不会像以前那样在玩家和其他对象上绘制.
我有一个Draw对象,它是一个JPanel并覆盖paintComponent方法.在这个方法中,我绘制当前房间的地板,然后迭代属于当前房间的对象列表,并调用每个对象的绘制方法来绘制所有内容.
对象绘制方法:
public void draw(Graphics g) {
if (visible && checkInScreen()) {
// The required drawing location
int drawLocationX = getX() - globalCameraX;
int drawLocationY = getY() - globalCameraY;
if (shadow) {
g.drawImage(shadowImages.get(imageIndex),
drawLocationX + shadowOffset.x + (getImageWidth()/2),
drawLocationY + shadowOffset.y, null);
}
g.drawImage(images.get(imageIndex), drawLocationX, drawLocationY, null);
//Collisionbox
if (SHOW_COLLISION_BOXES){
g.setColor(Color.WHITE);
g.drawRect(drawLocationX + getCollBoxX(), drawLocationY + getCollBoxY(), getCollBoxW() - getCollBoxX(), getCollBoxH() - getCollBoxY());
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果这个问题已被提出,我很抱歉,但我找不到类似的东西.