Voilà comment je mess avec images essayer, son conçu pour les bitmaps, mais vous pouvez le modifier pour faire jpg et png. il les charge à un tableau d'octets pour la manipulation. c'est la version la plus de travail de base que je peux trouver comme je l'ai développé davantage depuis
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;
}
}
et est ici la classe de test
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!");
}
}
Pouvez-vous montrer les images source et de sortie? Remmber Jpg est un format avec perte, donc en décompressant et en recompressant la même image peut entraîner une image différente surtout si les paramètres de compression sont différents – Sibster