我正在尝试使用BufferedImage
读取和写入灰度图像。但是书写图像中的像素与其来源略有不同。我不熟悉这个图像处理的东西。请任何人帮我找到我在代码中犯的错误。
这是我的代码
File InImage=new File("source.jpg");
File OutImage=new File("out.jpg");
/* code for reading the image*/
BufferedImage image=ImageIO.read(InImage);
WritableRaster raster=image.getRaster();
/* writing the same raster to a new image */
BufferedImage newImg=new BufferedImage(raster.getWidth(), raster.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
newImg.setData(raster);
ImageIO.write(newImg, "jpg", OutImage);
答案 0 :(得分:2)
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ToGray {
public static void main(String[] args) throws IOException {
File file = new File("f:/lion.jpg");
BufferedImage img = ImageIO.read(file);
int width = img.getWidth();
int height = img.getHeight();
int[][] pixel = new int[width][height];
Raster raster = img.getData();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
pixel[i][j] = raster.getSample(i, j, 0);
}
}
BufferedImage theImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int value = pixel[i][j] << 16 | pixel[i][j] << 8
| pixel[i][j];
theImage.setRGB(i, j, value);
}
}
File outputfile = new File("f:/op.png");
try {
ImageIO.write(theImage, "png", outputfile);
} catch (IOException e1) {
}
}
}
此代码只是读取和写入灰度图像的示例。我使用光栅读取图像并将rgb设置为写入图像。 您还可以使用get和setRGB来读取和写入图像。 写入的图像格式必须是bmp,gif,png等。由于jpg,jpeg在以这些格式写入后是有损压缩,我们可能会得到全黑图像。在看到图像的数组值时,我们可能得到0或1或2个值作为像素强度。使用png。
答案 1 :(得分:1)
我几乎可以肯定原始图片不是TYPE_BYTE_GRAY
类型。我建议你输出与输入图像相同的图像类型:
BufferedImage newImg = new BufferedImage(raster.getWidth(), raster.getHeight(), image.getType());
答案 2 :(得分:0)
答案 3 :(得分:0)
这就是我弄乱图像试试看,它是为bitmaps设计的,但你可以编辑它来做jpg和png。它将它们加载到一个字节数组进行处理。这是我能找到的最基本的工作版本,因为我已经进一步开发了
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageEdit
{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
// TODO Auto-generated method stub
//loadBitmapToBytes("icon","resources");
//WriteByteToBitmapFile("foo", "food", null);
}
public static byte [] loadBitmapToBytes (String filename, String dir) throws IOException
{
String a = "\\\\";
String b = ".bmp";
String readDir = dir + a + filename + b;
BufferedImage image = ImageIO.read(new File(readDir));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "bmp", baos);
byte[] img=baos.toByteArray();
return img;
}
public static void writeByteToBitmapFile (String filename, String dir, byte [] img) throws IOException
{
String a = "/";
String b = ".bmp";
String writeDir = dir + a + filename + b;
BufferedImage imageA = ImageIO.read(new ByteArrayInputStream(img));
ImageIO.write(imageA, "BMP", new File(writeDir));
System.out.println(writeDir);
}
public static byte [] invertBitmap(byte[] img)
{
int indexNo = 54;
for(int i = 54; i < (img.length-54)/3; i++)
{
img[indexNo] = (byte) (255-img[indexNo]);
indexNo++;
img[indexNo] = (byte) (255-img[indexNo]);
indexNo++;
img[indexNo] = (byte) (255-img[indexNo]);
indexNo++;
}
return img;
}
public static byte [] invertSingleBitmapChannel(char chanel, byte [] img)
{
String a = "Color Chanel bad Input";
int indexNo = 54;
for (int i = 54; i < (img.length-54)/3; i++, indexNo++ )
{
if (chanel == 'B' || chanel == 'b')
{
img[indexNo] = (byte) (255-img[indexNo]);
indexNo+=2;
}
else if (chanel == 'G' || chanel == 'g')
{
indexNo++;
img[indexNo] = (byte) (255-img[indexNo]);
indexNo++;
}
else if (chanel == 'R' || chanel == 'r')
{
indexNo+=2;
img[indexNo] = (byte) (255-img[indexNo]);
}
else
{
System.out.println(a);
return null;
}
}
return img;
}
public static byte [] greyFromBitmapColor(char fromColor, byte [] img)
{
int temp;
int indexNo = 54;
String a = "Color Chanel bad Input";
for(int i = 54; i < (img.length-54)/3; i++, indexNo++)
{
if (fromColor == 'B' || fromColor == 'b')
{
temp = img[indexNo+2];
img[indexNo] = (byte) temp;
indexNo++;
img[indexNo] = (byte) temp;
indexNo++;
}
else if (fromColor == 'G' || fromColor == 'g')
{
temp = img[indexNo+1];
img[indexNo] = (byte) temp;
indexNo+=2;
img[indexNo] = (byte) temp;
}
else if (fromColor == 'R' || fromColor == 'r')
{
temp = img[indexNo];
indexNo++;
img[indexNo] = (byte) temp;
indexNo++;
img[indexNo] = (byte) temp;
}
else
{
System.out.println(a);
return null;
}
}
return img;
}
public static byte [] greyFromBitmapAverage(byte [] img)
{
int temp;
int indexNo = 54;
for(int i = 54; i < (img.length-54)/3; i++, indexNo++)
{
temp = (img[indexNo]+img[indexNo+1]+img[indexNo+2])/3;
img[indexNo] = (byte) temp;
indexNo++;
img[indexNo] = (byte) temp;
indexNo++;
img[indexNo] = (byte) temp;
}
return img;
}
public static byte [] removeChannelFromBitmap(char lostColor, byte [] img)
{
String a = "Color Chanel bad Input";
int indexNo = 54;
for(int i = 54; i < (img.length-54)/3; i++, indexNo++)
{
if (lostColor == 'B' || lostColor == 'b')
{
img[indexNo] = 0;
indexNo+=2;
}
else if (lostColor == 'G' || lostColor == 'g')
{
indexNo++;
img[indexNo] = 0;
indexNo++;
}
else if (lostColor == 'R' || lostColor == 'r')
{
indexNo+=2;
img[indexNo] = 0;
}
else
{
System.out.println(a);
return null;
}
}
return img;
}
public static byte [] greyFromDominantBitmapColor (byte [] img)
{
int indexNo = 54;
long r = 0;
long g = 0;
long b = 0;
char dom = 'b';
for(int i = 54; i < (img.length-54)/3; i++, indexNo++)
{
b += img[indexNo];
indexNo++;
g += img[indexNo];
indexNo++;
r += img[indexNo];
}
if (b > 0)
dom = 'b';
if (g > b)
dom = 'g';
if (r > g)
dom = 'r';
greyFromBitmapColor(dom, img);
return img;
}
}
这是测试类
import java.io.IOException;
public class TestApp {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
byte [] img = ImageEdit.loadBitmapToBytes("fooInv","resources");
//ImageEdit.invertBitmap(img);
//ImageEdit.greyFromBitmapColor('r',img);
ImageEdit.greyFromDominantBitmapColor(img);
//ImageEdit.invertBitmap(img);
//ImageEdit.writeByteToBitmapFile("fooInv", "resources", img);
System.out.println("Done!");
}
}