我们正在使用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照片大小调整解决方案吗?
谢谢!
我使用Graphics2D界面生成一些图像,偶尔我希望能够在图像上绘制一些文本并应用于Adobe Photoshop中的效果.
现在我在文本上生成一个'阴影'我正在绘制文本两次,一次是原始颜色,一次是黑色,有一个轻微的(1px)x和y偏移.不幸的是,由于我需要对阴影(不透明度,大小,传播)进行更多控制,因此过于简单.
至于内发光和外发光,我不确定从哪里开始; 面具/渐变涂料/ alpha混合?
是否有用于生成这些类型效果的Java库?如果不是,您将如何创建这些效果?
我正在尝试使用Java和Scalr 3.2创建此图像的高质量缩略图

这是相关的源代码,其中THUMB_WIDTH = 77和THUMB_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",结果如下:

如果我使用format = "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)
我正在寻找一些物理模拟,我需要在Java中快速渲染.
我过去遇到过Java2d的性能问题,那么快速的选择是什么?JOGL明显比Java2d快吗?
前几天我正在参与线程图像/图形到一个形状,并通过Rectangle迭代添加到图像来做一个黑客尝试获取图像的轮廓Area.那很慢.
这个例子改为构建一个GeneralPath并Area从GP 创建.快多了.

左上角的图像是"源图像".右边的两个是处理轮廓的各个阶段.它们都有圆形边缘和三角形倾斜边缘的锯齿状边缘.
我希望获得一种能够消除或减少锯齿状的形状.
1234
1 **
2 **
3 ***
4 ***
5 ****
6 ****
Run Code Online (Sandbox Code Playgroud)
角落在:
1234
1 ****
2 ****
3 **
4 **
5 ****
6 ****
Run Code Online (Sandbox Code Playgroud)
角落在:
假设我们的路径具有显示的形状和列出的点,我想放下第一组的"内角"点,同时保留"内部角落的一对"(图像中的一对)第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) 我有幸遭遇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) 在Java2D中,当你使用setOpaque时,我对true和false的作用有点困惑.
例如,我知道在Swing Opaque中意味着在绘制Swing时不会绘制组件后面的内容.或者这是倒退?哪一个?
谢谢
当使用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对象创建了一个在用户坐标中绘制的矩形的描边形状,然后被转换为屏幕坐标),但我不确定如何解决这个问题.
编辑:如果任何人还有任何其他建议,以提高屏幕捕获性能,请随意分享,因为它可能完全解决我的问题!
你好开发者,
我正在为自己制作一些基本的屏幕捕获软件.截至目前,我已经获得了一些概念/修补代码的证明,它使用java.awt.Robot将屏幕捕获为BufferedImage.然后我执行此捕获指定的时间,然后将所有图片转储到磁盘.从我的测试中我得到大约每秒17帧.
时长:15秒拍摄的图像:255
时长: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) 好的,我理解你需要一个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变量取决于您自己的屏幕设置,您必须更改它,以便以适合您屏幕的分辨率显示游戏.