如何将2D数组转换为灰度png.现在我有这个:
BufferedImage theImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
for(int y = 0; y<100; y++){
for(int x = 0; x<100; x++){
theImage.setRGB(x, y, image[y][x]);
}
}
File outputfile = new File("saved.bmp");
ImageIO.write(theImage, "png", outputfile);
Run Code Online (Sandbox Code Playgroud)
但是图像是蓝色的.我怎样才能使它成为灰度.
image [] []包含0到256之间的整数.
我想检查图像的尺寸,然后在宽度超过给定阈值时调整尺寸.当我使用ImageIO.read()加载6MB JPEG图像时,BufferedImage会分配大约45MB的堆空间.有没有办法在不将所有数据加载到内存中的情况下调整直通图像大小?我尝试传递ImageIO.read()一个File对象,认为它会从磁盘流式传输数据,但它没有帮助.
我需要将 a 写BufferedImage为 .png 且不执行压缩。我环顾四周,并提出了以下代码。
public void save(String outFilePath) throws IOException {
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("png");
ImageWriter writer = iter.next();
File file = new File(outFilePath);
ImageOutputStream ios = ImageIO.createImageOutputStream(file);
writer.setOutput(ios);
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(1.0f);
IIOImage image = new IIOImage(mapImage, null, null);
writer.write(null, image, iwp);
writer.dispose();
//ImageIO.write(mapImage, "png", file);
}
Run Code Online (Sandbox Code Playgroud)
这是抛出的异常。
Exception in thread "main" java.lang.UnsupportedOperationException: Compression not supported.
at javax.imageio.ImageWriteParam.setCompressionMode(Unknown Source)
at Map.MapTransformer.save(MapTransformer.java:246)
at Map.MapTransformer.main(MapTransformer.java:263)
Run Code Online (Sandbox Code Playgroud) 我有一个用户上传图像的Web应用程序.我们通过ImageIO.read()验证图像数据,并在生成的BufferedImage上执行一些简单的转换,然后将其保存到磁盘.
在执行负载测试时,我们意识到当许多请求同时进入时,它们在ImageIO.read()调用中被阻止.深入挖掘,我们注意到JPEGImageReader是同步的,并且一次只创建一个BufferedImage.
还有其他人遇到过这个吗?我已经谷歌搜索了几天,并没有遇到有这个问题的另一个人,所以也许我做错了什么.我无法想出为什么会这样.对于某些内存泄漏问题,似乎无法为每个映像创建单独的读者和写入器,但这种解释对我来说似乎相当薄弱.
编辑:这是一个性能工具,打破了这么长时间.我相信这是由于所有线程都在等待同步锁定,JPEGImageReader源码.
编辑:JAI库可以工作,除了OpenJDK已经删除了对它的关键部分的支持,明确地是JPEG编解码器.
解决方案:考虑到我花费大量时间寻找替代解决方案并且未能这样做,我最好的解决方案是根据请求异步处理图像.因此,当请求进入时,原始图像数据被存储为所谓的有效图像; 然后,请求线程之外的异步进程将一次处理一个图像.由于ImageIO库的同步性,尝试一次执行多个操作没有任何好处.考虑到库不是同步的,只能是低效的,可以并行处理图像.
虽然异步处理会增加一定程度的复杂性,但在修改图像方面可能是一个好主意.不起作用的是我们无法在每个请求中处理原始图像,这意味着我们的系统必须假设每个图像都是有效的图像数据.当异步处理器确实处理图像时,如果数据不好,可能会出现系统不一致的情况.
我想将 PDF 页面转换为图像文件。当我使用 java 将 PDF 页面转换为图像时,文本丢失。
我想要转换46_2.pdf 的文件在转换后显示为46_2.png
代码:
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.List;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
public class ConvertPDFPageToImageWithoutText {
public static void main(String[] args) {
try {
String oldPath = "C:/PDFCopy/46_2.pdf";
File oldFile = new File(oldPath);
if (oldFile.exists()) {
PDDocument document = PDDocument.load(oldPath);
List<PDPage> list = document.getDocumentCatalog().getAllPages();
for (PDPage page : list) {
BufferedImage image = page.convertToImage();
File outputfile = new File("C:/PDFCopy/image.png");
ImageIO.write(image, "png", outputfile);
document.close();
}
}
} catch …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Java做一些图像处理.我使用ImageIO库来读写图像.我可以通过以下两种方式读取图像像素值(可能还有其他方法不知道).
使用BufferedImage的getRGB方法:
pixel = image.getRGB(x,y);
使用Raster的getSample方法:
WritableRaster raster = image.getRaster();
pixel = raster.getSample(x,y,0);
上述两种方法有何不同?
我是 Java 新手,正在尝试学习高级并发的概念。我在 Java Tutorial Oracle 上看到了这段代码。但是,当我运行代码时,IDE 输出的图像是全黑的。为什么会这样?还有,compute() 方法是如何调用的?
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import javax.imageio.ImageIO;
/**
* ForkBlur implements a simple horizontal image blur. It averages pixels in the
* source array and writes them to a destination array. The sThreshold value
* determines whether the blurring will be performed directly or split into two
* tasks.
*
* This is not the recommended way to blur images; it is only intended to
* illustrate the …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用开放的 JDK 11 imageIO ImageReader 和 ImageWriter 类将多个输入 TIFF 文件合并到一个多页输出 TIFF 文件中。我的例程几乎适用于我从许多不同品牌的扫描设备创建的所有示例输入文件。这些设备使用新旧 JPEG 压缩生成各种 TIFF 文件。但是,来自某一特定设备的 TIFF 文件会导致具有粉红色背景的错误输出。更奇怪的是,使用纵向扫描生成的 TIFF 会创建正确的输出,而使用同一设备的横向扫描生成的 TIFF 会生成带有粉红色背景的错误输出。我看不到 2 个输入文件之间的明显差异,这会导致 ImageIO 库处理时的行为差异。
我知道输出中的粉红色背景通常表示透明度解释存在问题。我在读取和写入 JEPG 图像时发现了许多对这个问题的引用。但是,我没有发现任何对 TIFF 图像类似问题的引用。当我在调试器中遍历 ImageReader 和 ImageWriter 时,我发现有效的输入 TIFF 文件与产生不良粉红色输出的文件之间没有明显区别。这两个文件都没有透明度。两者都具有相同的 YCbCr 光度解释、波段和子采样。有问题的 TIFF 文件使用旧的 JPEG 压缩,因此图像写入参数为 ImageWriter 明确指定新的 JPEG 压缩。但是,对于正常工作的类似肖像 TIFF 文件来说,这是正确的,
下面是一个简单的命令行应用程序,它重现了我的问题。
package com.example;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataFormatImpl;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; …Run Code Online (Sandbox Code Playgroud) 在javax.imageio.ImageIO有一个方法#write(RenderedImage im, String formatName, OutputStream output),接受一个“stringly类型的”格式开发者想要的图像被写入。
CanEncodeImageAndFormatFilter在该文件内部有一个名为deep的内部类,用于检查是否存在支持上述格式的 SPI(无论它是什么)。例如,BMPImageWriterSpi声明
private static String[] formatNames = {"bmp", "BMP"};
Run Code Online (Sandbox Code Playgroud)
但是在所有这些 SPI 类中,这些格式名称被声明为私有或默认包,因此我无法在我的应用程序中访问它们。但是我想在我现在正在处理的 API 中公开该格式参数,但我不想重新发明轮子。
? 是否有枚举或我可以安全地用作格式名称参数的东西#write方法?
是的,这更像是编码风格的基于意见的问题标签的。:D
ImageIO.write(image, "jpg", outStream);
Run Code Online (Sandbox Code Playgroud)
我想要的是:
ImageIO.write(image, ImageTypes.JPEG, outStream);
Run Code Online (Sandbox Code Playgroud) 我正在MultipartFile从休息控制器接收一个Spring 对象。我想任何稻毛文件转换为JPG图像,但我只需要将字节数组保存在mongoDb
我发现这段代码可以做到这一点
public boolean convertImageToJPG(InputStream attachedFile) {
try {
BufferedImage inputImage = ImageIO.read(attachedFile);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
boolean result = ImageIO.write(inputImage, "jpg", byteArrayOutputStream);
return result;
} catch (IOException e) {
System.err.println("Error " + e);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
但result作为一个false没有错误,所以ImageIO.write不起作用
我也发现这样做也一样,但使用File对象,我不想create目录上的文件,我只需要字节数组
public static boolean convertFormat(String inputImagePath,
String outputImagePath, String formatName) throws IOException {
FileInputStream inputStream = new FileInputStream(inputImagePath);
FileOutputStream outputStream = new …Run Code Online (Sandbox Code Playgroud) java ×10
javax.imageio ×10
png ×2
2d ×1
file-io ×1
fork-join ×1
graphics ×1
grayscale ×1
image ×1
inputstream ×1
pdf ×1
pdfbox ×1
spring-boot ×1
tiff ×1