我正在读取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指的是没有颜色的透明像素,我仍然会读取一种颜色,通常与图像中其他地方使用的颜色相同.
如何检测像素实际上是透明的而不是彩色的?
谢谢
当我读取某些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,但颜色也很淡(所以假设颜色信息无法正确读取).
我有一个方法将类型为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) 我的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) 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)
谢谢...
我需要将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) 当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读取的性能?
有问题的图片是这个(版主,请不要再次重新上传到其他托管网站,以便编码/质量不会改变)
我正在尝试从存储在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) 这是我的代码,它的实际工作,不完美,但它的问题是,调整大小的缩略图未粘贴在白色绘制的矩形,打破了图像纵横比,这里是代码,可能有人建议我修复好吗,拜托?
谢谢
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) 我通过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) javax.imageio ×10
java ×8
ios ×2
iphone ×2
jpeg ×2
uiimage ×2
animated-gif ×1
eclipse ×1
file ×1
graphics2d ×1
image ×1
ios4 ×1
jai ×1
objective-c ×1
resize ×1
swing ×1
tiff ×1
transparency ×1