ืืืืจืช ืืฉืืืช ืืืืื.
ื ืชืื ืงืืืฅ ืืจืคื (jpeg, png...). ืืฉ ืฆืืจื ืืขืฉืืช ืืืชื ืืื ืื ืืคืืืฆืืืช ืืืืชืื ืืช ืืชืืฆืื ืืงืืืฅ ืืืจ. ืืื ืืคืฉื, ืืืื ื ืืงื ืืืฉืืื ืฉืืืฉ ืืฉืืืืช: - ืงืื ืชืืื ื ืฉืืืืืช - ืงืื ืืจืกื ืืฉืืืจ-ืืื ืฉื ืืชืืื ื (ืืคืก ืืช ืืฆืืข) - ืฉื ื ืืช ืืจืืืื ืฉื ืืจืืง ืืชืืื ื. ืฉืืื ืื ืฉืืืืคื ืืืื ื ืืื, ืขื ืืื ืืืกืคืช ืฉืืืืช ืืืฉืืช, ืืืืฉื ืืฉืืืืช ื ืืกืคืืช: - ืืืืืื ืืืืช ืื ืืืฉืืฉ - ืืฉื ืืช ืืืืื - ืืกืืื ืขื ืืืืื ืืฉืขืื/ื ืื. - ืืืคืฉืจืืืืช ื ืืกืคืืช ืฉื ืคืืืืฉืืค :) ืืืืคื ืืืื, ืืืืฉื ืื ืืืืืจืืชื ืขื ืืชืืื ื, ืขื ืืื ืฉืืฉ ืื ื ืืกืคืืง ืืืืื ืืืืข ืืืชื (ืืืฉื, ืืืืืช ืืช ืืกืคืจ ืืืชืืืื ืืืคืฉืจืืื ืืชืืื ื).ืชืืืืจืื ืงืฆืช ืืืฉื.
ืื ื ืฉืืงืืื ืชืืื ืืช ืจืกืืจ (ืืฉ ืื ืืงืืืจ ืืืืจืืช). ืืืืืจ, ืืืฉืจ ืืงืืืฅ, ืื ืืกืฃ ืืืืชืจืช ืขืฆืื ืขื ืืืืข ืฉืืจืืช, ืืืืกื ืืืจืืฆื โโืืืื ืืช ืฉื ื ืงืืืืช. ืืืืื ืืืกื ืฉื ืืืืืืืืืช HD ืืืืจื ืืช, ืืขืืช ืจืืืืืฆืื ืฉื 1920x1080 ืคืืงืกืืื ืืื ืคืืงืกื ืืืืฆื ืืขืจืืื ืฉื ืฉืืืฉื ืจืืืื ืฆืืข: R(ed), G(reen), B(lue) = ืืืื, ืืจืืง ืืืืื. ืฆืืขืื ืืื ืื ืขืฆืืืืื ืืืืืื ืืื ื ืืงื ืืืืืืืืืื ืฉื ืชืคืืกืช ืืฆืืข. ืืขืื ืืฉ ืื ื ืงืื ืืกืื ืืืืืืช. ืงืื ืืกืื ืืฉืืืฉื ืื ืื (ืืืืืื ืืืื ืืฉืืืฉืช ืืืืื ืืืจืื ืืื), ืืืืืช "ืืขืืืื" ืืช ืืืืจืืช ืืฆืืข (ืืฉืจืขืช ืื ืืืืจ). ืืืืื RGB, ืืืืืืช ืืืจืืื ืขื ืขืจื ืืจืืื (0 - ืืืขืืจ, 255 - ืืืืจ ืืืืืจ ืืืืชืจ), ืืืงืื ืืกืื - ืืืชืืื, ืืืืื ืื-R/G/B ืืืงื ืืช ืืขืืฆืื ืืืชืืืื. ืืืืืื: ืืืกืจ ืืืจ - ืืืืืช/ืงืื ืืกืื ืืื ื ืืืืืื ื-RGB = (0,0,0). ืืืจ ืืื ืืืืง - ืื ืืงืื ืืกืื ืืืืืื ืืืืคื ืฉืืื, ืืืืืช ืืฉืชืืขืื ื-RGB = (255,255,255). ืืขืืืจ ืืืคืืจ ืจืฅ ืืจื - ืื ืืงืื ืืกืื ืืืืื ืืืืคื ืฉืืื, ืืืืืืช ืืืืื ืืืืืฆืข ื-RGB = (127,127,127). ืืชืื ืืื - ืืงืืืช R ื-G ืืืืืื, ืืงืืืช ืืงืืฉื ืืืืืื, RGB=(30, 30, 0) ...ืืืื ื ืชืืื ืืืชืืื.
ืืชืืชื ืืืืืื ืืขืืืื ืขื ืืชืื, ืื ืืงืื ืื ืืืืืฉ ืืคื ืื ืืืืืื ืืจืืืง ืืืืืืช ืืืคืืืืื: ืื ืื ื ืื ืืืืงืื ืคืจืืืจืื ืฉื ืงืื, ืื ืขืืฉืื ืืืืงืช ืฉืืืืืช ืืืื ืืื'. ืื ื ืืชื ืืฉืจ ืงืืืื, ืืื ืฉืื ืื. ืืคืืงืืก ืืขืืงืจื ืืื ืขืืืื ืขื ืืืื-ืกืืืืืช. ืืืื ื ืืชืื, ืืื ืืืืื ืืืฉืืืืช JavaRush, ืืื ืขืืจ ืืืกืืฃ ืฉืืืฉืจ ื ืงืจื ืืฉืืจืช ืืคืงืืื ืขื ืืืจืืืื ืืื ืืืชืืืืื, ืืฉื ื ืืช ืืชืืื ื. ืชืืื ืช ืืงืืจ:ืงืจืืื ืขื ืคืจืืืจืื -n kitten.jpg newkitten.jpg ืชืืฆืืจ ืชืืื ื:
ืงืจืืื ืขื ืคืจืืืจืื -b kitten.jpg newkitten.jpg ืชืืฆืืจ ืชืืื ื:
ืงืจืืื ืขื ืคืจืืืจืื -gr kitten.jpg newkitten.jpg ืชืืฆืืจ ืชืืื ื :
ืืขืฆื, ืืื .
package com.joysi.byteworld; import com.sun.imageio.plugins.jpeg.*; import com.sun.imageio.plugins.png.*; import javax.imageio.*; import javax.imageio.stream.*; import java.awt.image.BufferedImage; import java.io.*; public class image { public static void main(String[] args) throws IOException { CoolImage picture = new CoolImage(args[1]); // ะทะฐะณััะถะฐะตะผ ัะฐะนะป ะธะทะพะฑัะฐะถะตะฝะธั if ("-n".equals(args[0])) picture.convertToNegative(); if ("-g".equals(args[0])) picture.addColorGreenChannel(-100); if ("-bw".equals(args[0])) picture.convertToBlackAndWhite(); picture.saveAsJpeg(args[2]); } public static class CoolImage{ private int height; // ะฒััะพัะฐ ะธะทะพะฑัะฐะถะตะฝะธั private int width; // ัะธัะธะฝะฐ ะธะทะพะฑัะฐะถะตะฝะธั private int[] pixels; // ัะพะฑััะฒะตะฝะฝะพ ะผะฐััะธะฒ ัะฒะตัะพะฒ ัะพัะตะบ ัะพััะฐะฒะปัััะธั
ะธะทะพะฑัะฐะถะตะฝะธะต public int getPixel(int x, int y) { return pixels[y*width+x]; } // ะฟะพะปััะธัั ะฟะธะบัะตะปั ะฒ ัะพัะผะฐัะต RGB public int getRed(int color) { return color >> 16; } // ะฟะพะปััะธัั ะบัะฐัะฝัั ัะพััะฐะฒะปััััั ัะฒะตัะฐ public int getGreen(int color) { return (color >> 8) & 0xFF; } // ะฟะพะปััะธัั ะทะตะปะตะฝัั ัะพััะฐะฒะปััััั ัะฒะตัะฐ public int getBlue(int color) { return color & 0xFF;} // ะฟะพะปััะธัั ัะธะฝัั ัะพััะฐะฒะปััััั ัะฒะตัะฐ // ะะพะฝััััะบัะพั - ัะพะทะดะฐะฝะธะต ะธะทะพะฑัะฐะถะตะฝะธั ะธะท file public CoolImage(String fileName) throws IOException { BufferedImage img = readFromFile(fileName); this.height = img.getHeight(); this.width = img.getWidth(); this.pixels = copyFromBufferedImage(img); } // ะงัะตะฝะธะต ะธะทะพะฑัะฐะถะตะฝะธั ะธะท file ะฒ BufferedImage private BufferedImage readFromFile(String fileName) throws IOException { ImageReader r = new JPEGImageReader(new JPEGImageReaderSpi()); r.setInput(new FileImageInputStream(new File(fileName))); BufferedImage bi = r.read(0, new ImageReadParam()); ((FileImageInputStream) r.getInput()).close(); return bi; } // ะคะพัะผะธัะพะฒะฐะฝะธะต BufferedImage ะธะท ะผะฐััะธะฒะฐ pixels private BufferedImage copyToBufferedImage() { BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) bi.setRGB(j, i, pixels[i*width +j]); return bi; } // ะคะพัะผะธัะพะฒะฐะฝะธะต ะผะฐััะธะฒะฐ ะฟะธะบัะตะปะตะน ะธะท BufferedImage private int[] copyFromBufferedImage(BufferedImage bi) { int[] pict = new int[height*width]; for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) pict[i*width + j] = bi.getRGB(j, i) & 0xFFFFFF; // 0xFFFFFF: ะทะฐะฟะธััะฒะฐะตะผ ัะพะปัะบะพ 3 ะผะปะฐะดัะธั
byteะฐ RGB return pict; } // ะะฐะฟะธัั ะธะทะพะฑัะฐะถะตะฝะธั ะฒ jpeg-ัะพัะผะฐัะต public void saveAsJpeg(String fileName) throws IOException { ImageWriter writer = new JPEGImageWriter(new JPEGImageWriterSpi()); saveToImageFile(writer, fileName); } // ะะฐะฟะธัั ะธะทะพะฑัะฐะถะตะฝะธั ะฒ png-ัะพัะผะฐัะต (ะดััะณะธะต ะณัะฐัะธัะตัะบะธะต ัะพัะผะฐัั ะฟะพ ะฐะฝะฐะปะพะณะธะธ) public void saveAsPng(String fileName) throws IOException { ImageWriter writer = new PNGImageWriter(new PNGImageWriterSpi()); saveToImageFile(writer, fileName); } // ะกะพะฑััะฒะตะฝะฝะพ ะทะฐะฟะธัั file (ะพะฑัะฐั ะดะปั ะฒัะตั
ัะพัะผะฐัะพะฒ ัะฐััั). private void saveToImageFile(ImageWriter iw, String fileName) throws IOException { iw.setOutput(new FileImageOutputStream(new File(fileName))); iw.write(copyToBufferedImage()); ((FileImageOutputStream) iw.getOutput()).close(); } // ะบะพะฝะฒะตััะฐัะธั ะธะทะพะฑัะฐะถะตะฝะธั ะฒ ะฝะตะณะฐัะธะฒ public void convertToNegative() { for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) // ะัะธะผะตะฝัะตะผ ะปะพะณะธัะตัะบะพะต ะพััะธัะฐะฝะธะต ะธ ะพัะฑัะฐััะฒะฐะตะผ ััะฐััะธะน byte pixels[i*width + j] = ~pixels[i*width + j] & 0xFFFFFF; } // ะบะพะฝะฒะตััะฐัะธั ะธะทะพะฑัะฐะถะตะฝะธั ะฒ ัะตัะฝะพ-ะฑะตะปัะน ะฒะธะด public void convertToBlackAndWhite() { for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { // ะฝะฐั
ะพะดะธะผ ััะตะดะฝัั ะฐัะธัะผะตัะธัะตัะบัั ะธะฝัะตะฝัะธะฒะฝะพััั ะฟะธะบัะตะปั ะฟะพ ะฒัะตะผ ัะฒะตัะฐะผ int intens = (getRed(pixels[i * width + j]) + getGreen(pixels[i * width + j]) + getBlue(pixels[i * width + j])) / 3; // ... ะธ ะทะฐะฟะธััะฒะฐะตะผ ะตะต ะฒ ะบะฐะถะดัะน ัะฒะตั ะทะฐ ัะฐะท , ัะดะฒะธะณะฐั byteั RGB ะฝะฐ ัะฒะพะธ ะผะตััะฐ pixels[i * width + j] = intens + (intens << 8) + (intens << 16); } } // ะธะทะผะตะฝัะตะผ ะธะฝัะตัะธะฒะฝะพััั ะทะตะปะตะฝะพะณะพ ัะฒะตัะฐ public void addColorGreenChannel(int delta) { for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { int newGreen = getGreen(pixels[i * width + j]) + delta; if (newGreen > 255) newGreen=255; // ะััะตะบะฐะตะผ ะฟัะธ ะฟัะตะฒััะตะฝะธะธ ะณัะฐะฝะธั byteะฐ if (newGreen < 0) newGreen=0; // ะ ะธัะพะณะพะฒะพะผ ะฟะธะบัะตะปะต R ะธ B ัะฒะตัะฐ ะพััะฐะฒะปัะตะผ ะฑะตะท ะธะทะผะตะฝะตะฝะธะน: & 0xFF00FF // ะะพะปััะตะฝะฝัะน ะฝะพะฒัะน G (ะทะตะปะตะฝัะน) ะทะฐััะฝะตะผ ะฒ "ัะตัะตะดะธะฝะบั" RGB: | (newGreen << 8) pixels[i * width + j] = pixels[i * width + j] & 0xFF00FF | (newGreen << 8); } } } }
GO TO FULL VERSION