Com*_*erd 15 java debugging swing
当我尝试使用以下代码读取图像时
myPicture = ImageIO.read(new File("./src/javaassignment1b/Deck/Ace_Diamond_1.jpg"));
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Numbers of source Raster bands and source color space components do not match
Run Code Online (Sandbox Code Playgroud)
关于研究,有一个类似的问题,它似乎是我的JPEG图像的问题(它是从一个更大的图片裁剪可能导致错误)和我必须解决灰度问题,我不知道它是什么关于或如何实施它.
注意:起初我尝试使用ImageIcon添加到JPanel但它无法工作因此我发现这个解决方案导致我当前的问题.我刚开始用Java编程.
编辑:这是图像的链接,我正在做一个Java应用程序
我需要一个替代方案来将图像添加到JPanel.
这个问题已在这里得到解答:https://stackoverflow.com/a/18400559/1042999这是一个非常优雅的解决方案.该解决方案涉及使用ImageIO插件,实现对默认ImageIo实现不支持的多种格式的支持.有关如何在常规Java应用程序和servlet容器中使用插件的详细信息,请访问:https://github.com/haraldk/TwelveMonkeys
使用任何图像查看器/编辑器打开图像,并将其保存为“标准”格式
我想知道这些图像最初是如何创建的。我的猜测是,您使用了一些奇特的、复杂的图像处理程序来进行您提到的“裁剪”,并且该程序允许以某些不寻常的格式存储图像,并且您确实(或没有)修改了一些选项保存图像时可用,不知道这些选项到底意味着什么(如果我低估了您对图像格式和色彩空间的熟悉程度,我深表歉意......)。
然而,问题的原因是图像以某种奇怪的YPbPr或YCbCr颜色空间形式存储(我没有设法准确地弄清楚这一点,但默认情况下 ImageIO 都不支持它们)。
我对 YPbPb->RGB 或 YCbCb->RGB 应用标准颜色转换的尝试似乎都没有重现准确的原始颜色,但正如您在浏览维基百科文章时可能会注意到的那样:世界上释放了相当多的学术蒸汽色彩空间....
再次强调:我强烈建议您使用任何图像查看器/编辑器打开图像,并将它们保存为“标准”格式。最好是 PNG 格式,因为 JPG 不太适合此类图像。JPG 更适合“自然”图像,例如照片。对于这种“人造”图像,压缩必须非常低以避免伪影。
然而,该程序以几乎正确的颜色显示图像,但颜色转换似乎仍然不完全正确。
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class StrangeImageTest
{
public static void main(String[] args) throws IOException
{
final BufferedImage image = readImage(new File("Ace_Diamond_1.jpg"));
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JFrame f = new JFrame();
f.getContentPane().add(new JLabel(new ImageIcon(image)));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
static BufferedImage readImage(File file) throws IOException
{
return readImage(new FileInputStream(file));
}
static BufferedImage readImage(InputStream stream) throws IOException
{
Iterator<ImageReader> imageReaders =
ImageIO.getImageReadersBySuffix("jpg");
ImageReader imageReader = imageReaders.next();
ImageInputStream iis =
ImageIO.createImageInputStream(stream);
imageReader.setInput(iis, true, true);
Raster raster = imageReader.readRaster(0, null);
int w = raster.getWidth();
int h = raster.getHeight();
BufferedImage result =
new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
int rgb[] = new int[3];
int pixel[] = new int[3];
for (int x=0; x<w; x++)
{
for (int y=0; y<h; y++)
{
raster.getPixel(x, y, pixel);
int Y = pixel[0];
int CR = pixel[1];
int CB = pixel[2];
toRGB(Y, CB, CR, rgb);
int r = rgb[0];
int g = rgb[1];
int b = rgb[2];
int bgr =
((b & 0xFF) << 16) |
((g & 0xFF) << 8) |
(r & 0xFF);
result.setRGB(x, y, bgr);
}
}
return result;
}
// Based on http://www.equasys.de/colorconversion.html
private static void toRGB(int y, int cb, int cr, int rgb[])
{
float Y = y / 255.0f;
float Cb = (cb-128) / 255.0f;
float Cr = (cr-128) / 255.0f;
float R = Y + 1.4f * Cr;
float G = Y -0.343f * Cb - 0.711f * Cr;
float B = Y + 1.765f * Cb;
R = Math.min(1.0f, Math.max(0.0f, R));
G = Math.min(1.0f, Math.max(0.0f, G));
B = Math.min(1.0f, Math.max(0.0f, B));
int r = (int)(R * 255);
int g = (int)(G * 255);
int b = (int)(B * 255);
rgb[0] = r;
rgb[1] = g;
rgb[2] = b;
}
}
Run Code Online (Sandbox Code Playgroud)
(注意:这可以更简单地实现,使用 aColorConvertOp从用于图像的颜色空间转换为 RGB 颜色空间。但如上所述,我没有设法弄清楚使用哪个颜色空间来保存图像,即使我知道,也必须创建一个适当的ColorSpace实现。第一个网络搜索结果,如YCbCrColorSpace.java,不适用于给定的输入图像...)
| 归档时间: |
|
| 查看次数: |
18977 次 |
| 最近记录: |