标签: javax.imageio

如何在具有透明度的java BufferedImage中读取像素颜色

我正在读取BufferedImage中的像素颜色,如下所示:

.....
InputStream is = new BufferedInputStream(conn.getInputStream());
BufferedImage image = ImageIO.read(is);

int color = image.getRGB(x, y);

int  red = (colour & 0x00ff0000) >> 16;
int  green = (colour & 0x0000ff00) >> 8;
int  blue = colour & 0x000000ff;
Run Code Online (Sandbox Code Playgroud)

现在这个工作正常,除了透明度的png.我发现如果x,y指的是没有颜色的透明像素,我仍然会读取一种颜色,通常与图像中其他地方使用的颜色相同.

如何检测像素实际上是透明的而不是彩色的?

谢谢

java transparency bufferedimage javax.imageio

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

为什么Java ImageIO会使JPEG颜色变平

当我读取某些JPG文件时,颜色会变平.这是一个简单的例子,它读取jpg并将相同的图像写入另一个文件.

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class JPegReadTest {
    public static void main(String[] args) {
        if (args.length == 2) {
            try {
                BufferedImage src = ImageIO.read(new File(args[0]));
                ImageIO.write(src, "jpg", new File(args[1]));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.err.println("Usage: java JPegReadTest src dest");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用例如http://www.flickr.com/photos/visualpanic/233508614/sizes/l/尝试此操作,目标图像的颜色与源文件不同.这是为什么?怎么解决?

还尝试将图像保存为png,但颜色也很淡(所以假设颜色信息无法正确读取).

java jpeg javax.imageio

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

ColorConvertOp的更快替代品

我有一个方法将类型为TYPE_CUSTOM的BufferedImages转换为TYPE_INT_RGB.我使用以下代码,但我真的想找到一种更快的方法.

BufferedImage newImg = new BufferedImage(
    src.getWidth(), 
    src.getHeight(), 
    BufferedImage.TYPE_INT_RGB);

ColorConvertOp op = new ColorConvertOp(null);
op.filter(src, newImg);
Run Code Online (Sandbox Code Playgroud)

它工作正常,但它很慢,我想知道是否有更快的方法来进行此转换.

转换前的ColorModel:

ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@1c92586f transparency = 1 has alpha = false isAlphaPre = false
Run Code Online (Sandbox Code Playgroud)

转换后的ColorModel:

DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
Run Code Online (Sandbox Code Playgroud)

谢谢!


更新:

结果使用原始像素数据是最好的方法.由于TYPE_CUSTOM实际上是RGB转换,因此手动操作非常简单,比ColorConvertOp快约95%.

public static BufferedImage makeCompatible(BufferedImage img) throws IOException {
    // Allocate the new image
    BufferedImage dstImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);

    // Check if the ColorSpace is RGB and the TransferType is BYTE. …
Run Code Online (Sandbox Code Playgroud)

java jai javax.imageio

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

从UIImageJPEGRepresentation()获取的iPhone iOS保存数据第二次失败:ImageIO:CGImageRead_mapData'open'失败

我的UIImage操作遇到了一个奇怪的问题.

我正在进行Dropbox同步,并且必须将我的图像存储为本地文件.为此,我使用UIImagePNGRepresentation(image)或保存它们UIImageJPEGRepresentation(image, 0.66)

这是我的典型工作流程:用户选择图像或拍摄照片图像被分配到imageView图像视图的UIImage使用以下方法保存到文件中

下次用户重新打开应用程序时,我会使用文件从文件中读取图像

[UIImage imageWithContentsOfFile:fullImagePath]
Run Code Online (Sandbox Code Playgroud)

这个工作一次.

第二次运行例程时,我在尝试再次将映像保存到磁盘时收到下面列出的错误消息.

//saving the image
NSData* data = isPNG?UIImagePNGRepresentation(image):UIImageJPEGRepresentation(image, 0.66);
BOOL success =   [data writeToFile:filepath atomically:YES];
if(!success)
{
    DLog(@"failed to write to file: %@",filepath );
}


//loading the image
[UIImage imageWithContentsOfFile:fullImagePath]
Run Code Online (Sandbox Code Playgroud)

当我尝试重新保存以前转换为JPEG或PNG的图像时,我收到此错误

2012-05-21 08:16:06.680   file already exists: NO
ImageIO: CGImageRead_mapData 'open' failed '/var/mobile/Applications/C1312BF8-C648-4397-82F3-D93E4FAAD35F/Documents/imageData/LogoImage.jpg'
error = 2 (No such file or directory)
May 21 08:16:06  <Error>: ImageIO: JPEG Not a JPEG file: starts with 0xff 0xd9
May 21 08:16:06  <Error>: ImageIO: …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c uiimage ios javax.imageio

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

ImageIO无法读取输入文件

public static void imRes(String pat) {
        try {
            BufferedImage bckimg = ImageIO.read(new File("c:/s/deneme.jpg"));
            File s = new File(pat);
            BufferedImage im = ImageIO.read(s);
            BufferedImage im1 = resIm(im);
            BufferedImage finIm = mergIm(im1, bckimg);
            ImageIO.write(finIm, "jpg", new File("c:/s/deneme1.jpg"));
        } catch (IOException e) {

            e.printStackTrace();
        }
Run Code Online (Sandbox Code Playgroud)

这是我的第一篇文章,如果我做错了,请原谅.此代码正常运行,直到我尝试从源包中读取图像.但现在它无法读取任何图像.我究竟做错了什么?或者它是关于日食的东西?

例外:

javax.imageio.IIOException: Can't read input file!
    at javax.imageio.ImageIO.read(Unknown Source)
    at imRe.imRes(imRe.java:12)
    at imReTest.main(imReTest.java:6)
Run Code Online (Sandbox Code Playgroud)

谢谢...

java eclipse javax.imageio

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

将tiff转换为缓冲图像(Java)

我需要将tiff文件转换为BufferedImage.我写了以下代码:

String filepath = "C:\\tiffFolder\\";
String filename = "myTiffImage.tif";
File myFile = new File (filepath + filename); 
BufferedImage img = ImageIO.read(myFile);
Run Code Online (Sandbox Code Playgroud)

我知道myFile是正确实例化的:问题是在第四行代码后img仍为null.

我究竟做错了什么?非常感谢!

编辑

解决了,我使用了以下代码:

FileSeekableStream stream = new FileSeekableStream(filepath + filename);
TIFFDecodeParam decodeParam = new TIFFDecodeParam();
decodeParam.setDecodePaletteAsShorts(true);
ParameterBlock params = new ParameterBlock();
params.add(stream);
RenderedOp image1 = JAI.create("tiff", params);
BufferedImage img = image1.getAsBufferedImage();
Run Code Online (Sandbox Code Playgroud)

java bufferedimage tiff file javax.imageio

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

在Java中读取逐行编码的9000x9000 JPEG需要1分钟

javax.imageio.ImageIO用于从磁盘加载大分辨率(9000x9000)JPEG时,我的scala应用程序需要1分钟以上.我尝试创建一个仅限Java的项目,但它仍然需要很长时间 - 大约30秒.

这是我加载图像的方式:

File file = new File("/Users/the21st/slow2.jpg");
BufferedImage image = ImageIO.read(file);
Run Code Online (Sandbox Code Playgroud)

有没有办法提高在Java中逐步编码的大分辨率JPEG读取的性能?

有问题的图片是这个(版主,请不要再次重新上传到其他托管网站,以便编码/质量不会改变)

java jpeg javax.imageio

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

将JAR文件中的动画gif加载到ImageIcon中

我正在尝试从存储在jar文件中的动画gif创建一个ImageIcon.

ImageIcon imageIcon = new ImageIcon(ImageIO.read(MyClass.class.getClassLoader().getResourceAsStream("animated.gif")));
Run Code Online (Sandbox Code Playgroud)

图像加载,但只加载动画gif的第一帧.动画无法播放.

如果我从文件系统上的文件加载动画gif,一切都按预期工作.动画播放所有帧.这样可行:

ImageIcon imageIcon = new ImageIcon("/path/on/filesystem/animated.gif");
Run Code Online (Sandbox Code Playgroud)

如何从jar文件中将动画gif加载到ImageIcon中?

编辑:这是一个完整的测试用例,为什么不显示动画?

import javax.imageio.ImageIO;
import javax.swing.*;

public class AnimationTest extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                AnimationTest test = new AnimationTest();
                test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                test.setVisible(true);
            }
        });
    }

    public AnimationTest() {
        super();
        try {
            JLabel label = new JLabel();
            ImageIcon imageIcon = new ImageIcon(ImageIO.read(AnimationTest.class.getClassLoader().getResourceAsStream("animated.gif")));
            label.setIcon(imageIcon);
            imageIcon.setImageObserver(label);
            add(label);
            pack();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

java swing animated-gif javax.imageio

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

Java:检测图像格式,调整大小(缩放)并保存为JPEG

这是我的代码,它的实际工作,不完美,但它的问题是,调整大小的缩略图未粘贴在白色绘制的矩形,打破了图像纵横比,这里是代码,可能有人建议我修复好吗,拜托?

谢谢

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ImageScalerImageIoImpl implements ImageScaler {

 private static final String OUTPUT_FORMAT_ID = "jpeg";

 // Re-scaling image
 public byte[] scaleImage(byte[] originalImage, int targetWidth,
   int targetHeight) {

  try {
   InputStream imageStream = new BufferedInputStream(
     new ByteArrayInputStream(originalImage));
   Image image = (Image) ImageIO.read(imageStream);

   int thumbWidth = targetWidth;
   int thumbHeight = targetHeight;

   // Make sure …
Run Code Online (Sandbox Code Playgroud)

java resize image graphics2d javax.imageio

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

ImageIO:<ERROR> JPEG损坏的JPEG数据:数据段iphone的过早结束 - 如何捕获这个?

我通过HTTP下载图像得到此错误.我在这里看了答案,但即使是有效的图像也没有YES从函数返回.

还有其他想法吗?

获取图像的代码非常简单.这发生在后台线程中.

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
UIImage *image = [UIImage imageWithData:data];
Run Code Online (Sandbox Code Playgroud)

这是该线程的功能:

- (BOOL)isJPEGValid:(NSData *)jpeg {
    if ([jpeg length] < 4) return NO;
    const char * bytes = (const char *)[jpeg bytes];
    if (bytes[0] != 0xFF || bytes[1] != 0xD8) return NO;
    if (bytes[[jpeg length] - 2] != 0xFF || 
            bytes[[jpeg length] - 1] != 0xD9) return NO;
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

iphone uiimage ios4 ios javax.imageio

9
推荐指数
1
解决办法
9024
查看次数