标签: java-2d

是否有100%的Java替代ImageIO来读取JPEG文件?

我们正在使用Java2D调整上传到我们网站的照片的大小,但是我们遇到了一个问题(一个看似旧的问题,参见:http://forums.sun.com/thread.jspa?threadID = 5425569) - 一些特殊的JPEG CMMException当我们尝试ImageIO.read()包含其二进制数据的InputStream 时引发a :

java.awt.color.CMMException: Invalid image format
 at sun.awt.color.CMM.checkStatus(CMM.java:131)
 at sun.awt.color.ICC_Transform.<init>(ICC_Transform.java:89)
 at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:516)
 at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(JPEGImageReader.java:1114)
 at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
 at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1082)
 at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:897)
 at javax.imageio.ImageIO.read(ImageIO.java:1422)
 at javax.imageio.ImageIO.read(ImageIO.java:1326)
    ...
Run Code Online (Sandbox Code Playgroud)

(剪断了堆栈跟踪的剩余部分,这是我们的ImageIO.read()调用,servlet代码等)

我们将其缩小到特定相机拍摄的照片,然后我选择了一张触发此错误的照片:http://img214.imageshack.us/img214/5121/estacaosp.jpg.我们注意到这只发生在Sun的JVM上(在Linux和Mac上,只是在1.6.0_20上进行了测试) - 一台带有OpenJDK的测试机器可以顺利读取相同的照片,这可能是由于JPEG阅读器的不同实现.

不幸的是,我们无法在生产中切换JVM,也无法使用ImageMagick(http://www.imagemagick.org/)等本机相关解决方案.

考虑到这一点,我的问题是:是否存在可以处理链接照片之类的照片的ImageIO JPEG读取器的替代品?如果没有,我们可以使用另一个100%纯Java照片大小调整解决方案吗?

谢谢!

java jpeg java-2d resize-image javax.imageio

20
推荐指数
3
解决办法
2万
查看次数

如何在Java Swing中创建投影,内部发光和外部发光?

我使用Graphics2D界面生成一些图像,偶尔我希望能够在图像上绘制一些文本并应用于Adobe Photoshop中的效果.

现在我在文本上生成一个'阴影'我正在绘制文本两次,一次是原始颜色,一次是黑色,有一个轻微的(1px)x和y偏移.不幸的是,由于我需要对阴影(不透明度,大小,传播)进行更多控制,因此过于简单.

至于内发光和外发光,我不确定从哪里开始; 面具/渐变涂料/ alpha混合?

是否有用于生成这些类型效果的Java库?如果不是,您将如何创建这些效果?

java graphics swing effects java-2d

20
推荐指数
1
解决办法
2万
查看次数

如何获得高质量的缩略图

我正在尝试使用Java和Scalr 3.2创建此图像的高质量缩略图

全尺寸图像

这是相关的源代码,其中THUMB_WIDTH = 77THUMB_HEIGHT = 57

BufferedImage srcImg = ImageIO.read(new File(sourceFile)); 
BufferedImage dstImg = Scalr.resize(srcImg, Scalr.Method.QUALITY, 
    THUMB_WIDTH, THUMB_HEIGHT); 
ImageIO.write(dstImg, format, new File(destFile));
Run Code Online (Sandbox Code Playgroud)

如果我使用format = "png",结果如下:

png缩略图

如果我使用format = "jpg",结果如下:

jpg缩略图

通过imagemagick识别,我发现JPEG的质量保存为75,完全不足以创建美观的缩略图.PNG对我来说也不好看.

以下是原始文件的标识输出和两个缩略图:

$ identify 42486_1.jpg 42486_s1.jpg 42486_s1.png 
42486_1.jpg JPEG 580x435 580x435+0+0 8-bit DirectClass 50.6KB 0.000u 0:00.000
42486_s1.jpg[1] JPEG 77x58 77x58+0+0 8-bit DirectClass 2.22KB 0.000u 0:00.000
42486_s1.png[2] PNG 77x58 77x58+0+0 8-bit DirectClass 12.2KB 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)

问题

  • 如何提高生成的缩略图的质量?
  • 如何保存质量更高的JPEG?我想尝试更高的质量并比较结果.我在JavaDoc for ImageIO.write中找不到任何东西. …

java java-2d image-resizing scalr

19
推荐指数
1
解决办法
1万
查看次数

什么是Java2d更快的替代品?

我正在寻找一些物理模拟,我需要在Java中快速渲染.

我过去遇到过Java2d的性能问题,那么快速的选择是什么?JOGL明显比Java2d快吗?

java performance rendering java-2d jogl

17
推荐指数
2
解决办法
6953
查看次数

平滑锯齿状路径

前几天我正在参与线程图像/图形到一个形状,并通过Rectangle迭代添加到图像来做一个黑客尝试获取图像的轮廓Area.那很慢.

这个例子改为构建一个GeneralPathArea从GP 创建.快多了.

用于处理的样本图像

左上角的图像是"源图像".右边的两个是处理轮廓的各个阶段.它们都有圆形边缘和三角形倾斜边缘的锯齿状边缘.

我希望获得一种能够消除或减少锯齿状的形状.

在ASCII艺术中.

情况1:

  1234
1 **
2 **
3 ***
4 ***
5 ****
6 ****
Run Code Online (Sandbox Code Playgroud)

角落在:

  • (2,3)内角
  • (3,3)
  • (3,5)内角
  • (4,5)

案例2:

  1234
1 ****
2 ****
3 **
4 **
5 ****
6 ****
Run Code Online (Sandbox Code Playgroud)

角落在:

  • (4,2)
  • (2,2)内角
  • (2,5)内角
  • (4,5)

假设我们的路径具有显示的形状和列出的点,我想放下第一组的"内角"点,同时保留"内部角落的一对"(图像中的一对)第2位.


  • 任何人都可以建议一些聪明的内置方法来完成这项工作的繁重工作吗?
  • 如果不这样做,那么识别内角的位置和性质(对/单)的好方法是什么?(我猜我可以得到一个PathIterator并建立一个新的GeneralPath掉落奇异的内角 - 如果我能想出如何识别它们!).

以下是要使用的代码:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;

/* Gain …
Run Code Online (Sandbox Code Playgroud)

java image image-processing java-2d edge-detection

13
推荐指数
1
解决办法
5823
查看次数

我如何解决java2d中的ClassCastException(Bug-ID 7172749)

我有幸遭遇java8中的一个错误,对于其他任何人来说这似乎都不是一个大问题,因此Oracle不会在java9之前修复它.
该缺陷有错误-ID 7172749(还要注意相关的和重复的错误),它只是碰巧所有的时间有一定的Linux机器上.
我在使用jdk1.8.0_u66的Ubuntu 14.04.3 LTS上遇到了问题.
但是,在Ubuntu 12.04.3 LTS和相同 JDK版本的另一个盒子上,我根本无法重现这个问题.

让我感到困惑的是,对于其他任何人来说,这似乎并不是一个显而易见的事情,所以我想也许我正在犯一个特别的转储错误.我正在运行Oracle-JDK(而不是OpenJDK),因为我们的客户使用相同的版本(尽管在Windows上)并且想法是接近他们的环境.

所以,我的问题是,如何解决这个问题(例如,安装X11-library xy,使用魔法-XXjava2dfailsafe参数启动我的java程序或沿着这些行开始)
并加入一群可以舒服地等待实际的人问题由oracle修复?

最好的问候Tobi

顺便说一句,我的stackstrace看起来像这样:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.BufImgSurfaceData cannot be cast to sun.java2d.xr.XRSurfaceData
    at sun.java2d.xr.XRPMBlitLoops.cacheToTmpSurface(XRPMBlitLoops.java:145)
    at sun.java2d.xr.XrSwToPMBlit.Blit(XRPMBlitLoops.java:353)
    at sun.java2d.SurfaceDataProxy.updateSurfaceData(SurfaceDataProxy.java:498)
    at sun.java2d.SurfaceDataProxy.replaceData(SurfaceDataProxy.java:455)
    at sun.java2d.SurfaceData.getSourceSurfaceData(SurfaceData.java:233)
    at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:566)
    at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:67)
    at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1014)
    at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3318)
    at sun.awt.image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:813)
    at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1021)
[...]
Run Code Online (Sandbox Code Playgroud)

java linux awt java-2d java-8

13
推荐指数
1
解决办法
5757
查看次数

setOpaque(真/假); Java的

在Java2D中,当你使用setOpaque时,我对true和false的作用有点困惑.

例如,我知道在Swing Opaque中意味着在绘制Swing时不会绘制组件后面的内容.或者这是倒退?哪一个?

谢谢

java graphics swing java-2d

12
推荐指数
1
解决办法
5万
查看次数

AffineTransform没有改变中风?

当使用scale()具有两个不同参数的Graphics2D 函数(在x和y方向上按不同比例缩放)时,稍后在此Graphics2D对象上绘制的所有内容也会缩放.这具有奇怪的效果,即在一个方向上绘制的线比在另一个方向上绘制的线更粗.以下程序产生此效果,它显示以下窗口:

示例截图

public class StrokeExample extends JPanel {


    public void paintComponent(Graphics context) {
        super.paintComponent(context);
        Graphics2D g = (Graphics2D)context.create();
        g.setStroke(new BasicStroke(0.2f));

        int height = getHeight();
        int width = getWidth();

        g.scale(width/7.0, height/4.0);

        g.setColor(Color.BLACK);
        g.draw(new Rectangle( 2, 1, 4, 2));
    }

    public static void main(String[] params) {
        EventQueue.invokeLater(new Runnable(){public void run() {

            StrokeExample example = new StrokeExample();

            JFrame f = new JFrame("StrokeExample");
            f.setSize(100, 300);
            f.getContentPane().setLayout(new BorderLayout());
            f.getContentPane().add(example);
            f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            f.setVisible(true);
        }});

    }

}
Run Code Online (Sandbox Code Playgroud)

我正在使用此坐标转换以避免必须手动将我的应用程序模型坐标(在此示例中为(2,1,2,4))转换为屏幕(或组件)像素坐标,但我不希望此笔画失真.换句话说,我希望所有线都具有相同的宽度,与当前的x和y尺度因子无关.

我知道是什么产生了这种效果(Stroke对象创建了一个在用户坐标中绘制的矩形的描边形状,然后被转换为屏幕坐标),但我不确定如何解决这个问题.

  • 我应该创建一个新的Stroke实现,它在X和Y方向上以不同的方式描绘Shapes(从而在这里消除失真)?(或者是否有人已经知道这样的实现?)
  • 我应该将我的形状转换为屏幕坐标和笔划吗?
  • 还有其他(更好的)想法吗?

java awt java-2d affinetransform stroke

12
推荐指数
2
解决办法
2747
查看次数

使用Java和awt.Robot时提高屏幕捕获速度

编辑:如果任何人还有任何其他建议,以提高屏幕捕获性能,请随意分享,因为它可能完全解决我的问题!

你好开发者,

我正在为自己制作一些基本的屏幕捕获软件.截至目前,我已经获得了一些概念/修补代码的证明,它使用java.awt.Robot将屏幕捕获为BufferedImage.然后我执行此捕获指定的时间,然后将所有图片转储到磁盘.从我的测试中我得到大约每秒17帧.

试验#1

时长:15秒拍摄的图像:255

试验#2

时长:15秒图像捕获:229

显然,这对于真正的屏幕捕获应用程序来说还不够好.特别是因为这些捕获只是在我的IDE中选择一些文本而没有任何图形密集的文本.

我现在有两个班级是Main类和一个"Monitor"类.Monitor类包含捕获屏幕的方法.我的Main类有一个基于时间的循环,它调用Monitor类并将它返回的BufferedImage存储到BufferedImages的ArrayList中.如果我修改我的主类来生成几个执行该循环的线程,并且还收集有关捕获图像的系统时间的信息,我可以提高性能吗?我的想法是使用一个共享数据结构,它将在插入时基于捕获时间自动对帧进行排序,而不是将连续图像插入到arraylist中的单个循环.

码:

监控

public class Monitor {

/**
 * Returns a BufferedImage
 * @return
 */
public BufferedImage captureScreen() {
    Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    BufferedImage capture = null;

    try {
        capture = new Robot().createScreenCapture(screenRect);
    } catch (AWTException e) {
        e.printStackTrace();
    }

    return capture;
}
}
Run Code Online (Sandbox Code Playgroud)

主要

public class Main {


public static void main(String[] args) throws InterruptedException {
    String outputLocation = "C:\\Users\\ewillis\\Pictures\\screenstreamer\\";
    String namingScheme = "image";
    String mediaFormat = "jpeg";
    DiscreteOutput output …
Run Code Online (Sandbox Code Playgroud)

java java-2d awtrobot javax.imageio

12
推荐指数
2
解决办法
6851
查看次数

Java图形闪烁

好的,我理解你需要一个SSCCE,所以我创建了(我的第一个).

我设法用200行代码复制问题.在我的系统上,这个演示编译并运行完美(当然只有闪烁仍在那里).我剥夺了与它无关的所有东西.所以基本上我们现在有两个源文件:屏幕管理器和游戏管理器.

屏幕管理员:http: //pastebin.com/WeKpxEXW

游戏经理:http: //pastebin.com/p3C5m8UN

你可以使用这个make文件编译这段代码(我使用的是移植版本的Linux'make for Windows):CC = javac BASE = nl/jorikoolstra/jLevel CLASS_FILES = classes/$(BASE)/Game/GameMain.class classes/$ (BASE)/Graphics/ScreenManager.class

jLevel: $(CLASS_FILES)
    @echo Done.

classes/%.class : src/%.java
    @echo Compiling src/$*.java to $@ [command: $(CC) src/$*.java ] ...
    @$(CC) -Xlint:unchecked -d classes -classpath src src/$*.java
Run Code Online (Sandbox Code Playgroud)

源文件放在/src目录和目录中的类中/classes.

在编译为字节码后,可以使用以下.bat文件启动游戏:

@set STARUP_CLASS=nl.jorikoolstra.jLevel.Game.GameMain
@set ARGUMENTS=1280 1024 32
@java -cp classes;resources %STARUP_CLASS% %ARGUMENTS%
Run Code Online (Sandbox Code Playgroud)

请注意,ARGUMENT变量取决于您自己的屏幕设置,您必须更改它,以便以适合您屏幕的分辨率显示游戏.

java windows java-2d game-development

10
推荐指数
1
解决办法
7569
查看次数