我在将png转换为tiff时遇到问题.转换很顺利,但图像很大.我认为问题是我没有正确进行压缩?任何人都有任何建议?
这是代码示例
public static void test() throws IOException {
// String fileName = "4958813_1";
String fileName = "4848970_1";
String inFileType = ".PNG";
String outFileType = ".TIFF";
ImageIO.scanForPlugins();
File fInputFile = new File("I:/HPF/UU/" + fileName + inFileType);
InputStream fis = new BufferedInputStream(new FileInputStream(
fInputFile));
PNGImageReaderSpi spi = new PNGImageReaderSpi();
ImageReader reader = spi.createReaderInstance();
ImageInputStream iis = ImageIO.createImageInputStream(fis);
reader.setInput(iis, true);
BufferedImage bi = reader.read(0);
TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi();
ImageWriter writer = tiffspi.createWriterInstance();
//Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("TIFF");
//ImageWriter writer = iter.next();
ImageWriteParam …Run Code Online (Sandbox Code Playgroud) 当我尝试压缩jpg图像时,大多数情况下它完美地工作,但是一些jpg图像在压缩后变为绿色.这是我的代码
public void compressImage(String filename, String fileExtension) {
BufferedImage img = null;
try {
File file = new File(filename);
img = ImageIO.read(file);
if (fileExtension.toLowerCase().equals(".png") || fileExtension.toLowerCase().equals(".gif")) {
//Since there might be transparent pixel, if I dont do this,
//the image will be all black.
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
int rgb = img.getRGB(x, y);
int alpha = (rgb >> 24) & 0xff;
if (alpha != …Run Code Online (Sandbox Code Playgroud) 提前谢谢你的帮助
描述:程序绘制,显示和保存图像.它的工作原理如下:对象本身扩展了Frame.在构造函数中,该对象创建一个BufferedImage,并调用一个绘制到该图像上的方法.然后,它将图像显示在帧上.最后,它将图像保存到文件中(我不关心它使用的是什么格式).主程序创建对象,其余部分完成.
问题:保存的文件始终具有彩色背景!由于显示的图像很好,这尤其奇怪.如果我在ImageIO.write()中使用"jpg"格式,背景会偏红.如果我使用"png"格式,背景为深灰色.
我花了一段时间在这上面,我仍然不知道到底发生了什么!
import java.awt.Frame ;
import java.awt.image.BufferedImage ;
import java.io.IOException ;
import java.awt.event.WindowEvent ;
import java.awt.event.WindowAdapter ;
import java.awt.Toolkit ;
import java.awt.Graphics2D ;
import java.awt.Graphics ;
import java.awt.Color ;
import java.awt.Dimension ;
import javax.imageio.ImageIO ;
import java.io.File ;
import java.awt.geom.Rectangle2D;
public class HGrapher extends Frame{
private BufferedImage img ;
private float colors[][] ; //the colors for every rectangle
private double availWidth ;
private double availHeight ;
public HGrapher(String saveFileName, int numRects) throws IOException {
//*add window closer
addWindowListener(new …Run Code Online (Sandbox Code Playgroud) 我正试图通过java中的URL从互联网上获取图像.我正在使用以下代码.
URL url = new URL(webAddress);
image = ImageIO.read(url);
Run Code Online (Sandbox Code Playgroud)
有时它可以工作,有时它只是无限期挂起,具体取决于WebAddress是什么.没有错误消息,它只是继续运行,什么都不做.
通过将它们复制并粘贴到Web浏览器中来确认,它们永远挂起的地址肯定有图像.似乎没有哪种模式可以运行,哪些不运行 - 它们都是jpeg.我已经做了一些搜索并找到了一些从URL获取图像的其他方法,但同样的事情发生在所有这些 - 它们处理一些图像并挂在其他图像上.
你知道是什么原因造成这种情况,以及如何解决这个问题?
以下代码在BlueJ IDE中成功运行,但在Eclipse中未成功运行.
String path="images/pic1.jpg";
BufferedImage myPicture = null;
try {
myPicture = ImageIO.read(new File(path));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我的图像路径在IDE中都是相同的.另外,我观察到*.class文件和图像文件的目录结构是相同的.
为什么只在eclipse中发生这种情况?
为什么组合BG为JPEG的图像会导致意外结果?
这是我在2个图像的覆盖中无法正常工作的答案的后续行动.在那里发布的源(使用在内存中创建的BG图像)看起来像这样:

到现在为止还挺好.但是那个问这个问题的人评论说如果BG是JPEG,那就失败了.认为他们错了,我改变了我的例子,将BG图像编码为JPEG.现在,如果我使用BufferedImage.TYPE_INT_ARGB或BufferedImage.TYPE_INT_RGB为最终图像我得到他们所指的:
TYPE_INT_ARGB
TYPE_INT_RGB
我期望结果与至少其中一个的原始结果相同(更多的是ARGB变体).
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.net.URL;
import javax.imageio.ImageIO;
class CombineImages {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
URL urlImage1 =
new URL("http://i.stack.imgur.com/T5uTa.png");
// Load the FG image
Image fgImage = ImageIO.read(urlImage1);
int w = fgImage.getWidth(null);
int h = fgImage.getHeight(null);
// Create a …Run Code Online (Sandbox Code Playgroud) 我正在制作一个程序,它从服务器获取有关字节数组中图像的数据.我正在将这些数据转换为24位BMP格式(无论是jpeg,png,bmp还是8-24-32bpp).首先,我将它保存到我的HD,然后我将它加载到JLabel的Icon中.虽然在某些情况下我得到以下异常,但效果很好:
java.io.EOFException at
javax.imageio.stream.ImageInputStreamImpl.readFully(ImageInputStreamImpl.java:353) at
com.sun.imageio.plugins.bmp.BMPImageReader.read24Bit(BMPImageReader.java:1188) at
com.sun.imageio.plugins.bmp.BMPImageReader.read(BMPImageReader.java:843) at
javax.imageio.ImageIO.read(ImageIO.java:1448) at
javax.imageio.ImageIO.read(ImageIO.java:1308)
Run Code Online (Sandbox Code Playgroud)
这条线(第二条)
File imgFile = new File("d:/image.bmp");
BufferedImage image = ImageIO.read(imgFile);
Run Code Online (Sandbox Code Playgroud)
在这些情况下:
首先,我认为也许bpp是问题,然后我认为可能图片太大,但我有案例它的工作和案例它不适用于这两个建议.我有点卡在这里,并且很乐意提出想法.
我正在尝试阅读用户上传的JPEG图像(任意)以在服务器应用程序中创建缩略图.系统在Windows7/Oracle Java 8u11中工作得很好,但我在服务器上的CentOS下有颜色模型的问题:
原始图片是:
http://studio-st.ru/media/portfolio/image/45
在Windows下的开发工作站上生成的缩略图绝对正确
Linux下的结果是颜色偏移的(Java 8u05上带红色,Java 8u11上有颜色偏移).这里没有提供,因为原始示例在现场,现在已修复.
更深入的调查显示问题在于读取图像 - Windows和Linux上的ImageIO.read(inputStream)返回具有完全相同参数的图像对象,但是同一图像(刚刚读取)的颜色探针getRGB(x,y)返回不同的值.
Linux中的颜色在Java 8u05和8u11上有所不同,8u05是"红色",8u11如上所示.
这与alpha通道无关 - 这个特殊的源图像是JPEG Type 5(TYPE_3BYTE_BGR),从Adobe Lightroom导出并转换为sRGB,没有任何其他技巧.
这也会影响当时导出的所有图像(事实上,此网站上的所有图像).
任何人都可以提供一些有关如何使其工作的建议(除了等待JDK的修复)?也许推荐备用库,可以在这里使用(EJB,存储在MongoDB中的数据,因此使用InputStreams获取数据 - 无文件系统访问).
谢谢!
UPD:问题似乎与Java8的新色彩管理模块有关 - 它不了解这种图像格式.切换到旧版CMM解决了这个问题.请在下面的正确评论中查看详细信息
上下文
我正在审查服务器端应用程序中用于扩展图像的一些遗留Java代码.直到最近它主要用于具有1024x768或更低分辨率的输入图像,并且在这种情况下它似乎运行良好(或者至少足够好).
然而,现在,许多被操纵的图像的分辨率范围从2592x1936(8MP)到6000x4000(24MP).这导致OutOfMemoryError在服务器上频繁报告,我认为这是由图像处理代码引起的.
测试用例
我把一个简单的测试应用程序放在一起,调用图像处理代码的方式与服务器相同(有一点需要注意;测试用例是单线程的,而服务器环境显然不是这样):
public static void main(String[] args) throws Exception {
File file = new File("test_fullres.png"); //8MP test image, PNG format
for (int index = 0; index < 1000; index++) {
File output = new File("target/images/img_" + index + ".jpg");
verifyImageIsValidAndScale(file, output, 1024, 768, true, 80);
if (index % 10 == 0) {
String memStats = "Memstats after " + index + " iterations:";
memStats += "\tFree Memory: " + (Runtime.getRuntime().freeMemory() / 1024.0 / 1024.0) + …Run Code Online (Sandbox Code Playgroud) 我以最小的形式重新创建了这个问题:
主要的:
public class ImageIOMain extends Application {
@Override
public void start(Stage stage) throws Exception{
Scene scene = new Scene(new StackPane(), 800.0, 600.0);
stage.setScene(scene);
stage.show();
WritableImage img = scene.snapshot(null);
//Image file created on desktop
ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", new File("D:\\Desktop\\test.png"));
//Image file NOT created on desktop
ImageIO.write(SwingFXUtils.fromFXImage(img, null), "jpeg", new File("D:\\Desktop\\test.jpeg"));
}
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
重要提示:我使用的是 JavaFX 12。
如果我png在图像显示在我的桌面上时导出图像。例如,如果文件格式为 ,jpeg则不会创建图像。
过去,当我使用 JavaFX 8 保存时,jpeg使用上述代码会导致图像变成粉红色。现在在版本 12 中没有任何反应。
那么我怎样才能创建一个不是格式png …
javax.imageio ×10
java ×9
image ×4
compression ×2
jpeg ×2
swing ×2
eclipse ×1
graphics2d ×1
java-8 ×1
javafx ×1
memory ×1
tiff ×1
url ×1