JavaRush /ื‘ืœื•ื’ Java /Random-HE /ืขื•ืœื ื”ื‘ืชื™ื 1. ืขื‘ื•ื“ื” ืขื ืชืžื•ื ื•ืช.
Joysi
ืจึธืžึธื”

ืขื•ืœื ื”ื‘ืชื™ื 1. ืขื‘ื•ื“ื” ืขื ืชืžื•ื ื•ืช.

ืคื•ืจืกื ื‘ืงื‘ื•ืฆื”
ื‘ืžื™ื•ื—ื“ ื‘ืฉื‘ื™ืœ ืœืคื ื™ ื–ื”, ื”ืกื‘ืจืชื™ ืขื ื“ื•ื’ืžืื•ืช ื™ื‘ืฉื•ืช. ื”ื ื‘ื™ืงืฉื• ืœืขื‘ื•ื“ ืขื ืชืžื•ื ื•ืช - ืงื‘ืœื•.
ื”ื’ื“ืจืช ืžืฉื™ืžืช ืœืžื™ื“ื”.
ื ืชื•ืŸ ืงื•ื‘ืฅ ื’ืจืคื™ (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); } } } }
ื”ืขืจื•ืช
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION