JavaRush /جاوا بلاگ /Random-SD /بائيٽ جي دنيا 1. تصويرن سان ڪم ڪرڻ.
Joysi
سطح

بائيٽ جي دنيا 1. تصويرن سان ڪم ڪرڻ.

گروپ ۾ شايع ٿيل
لاء خاص ان کان اڳ، مون خشڪ مثالن سان وضاحت ڪئي. انهن تصويرن سان ڪم ڪرڻ لاء چيو - حاصل ڪريو.
سکيا جو ڪم مقرر ڪرڻ.
ڏنل گرافڪ فائل (jpeg، png...). اهو ضروري آهي ته ان سان ڪجهه ڦيرڦار ڪريو ۽ نتيجو ڪنهن ٻئي فائل ڏانهن لکو. آسان ڪرڻ لاء، اچو ته ٽن ڪمن تي غور ڪريو: - هڪ منفي تصوير حاصل ڪريو - تصوير جو ڪارو ۽ اڇو نسخو حاصل ڪريو (رنگ ٻيهر سيٽ ڪريو) - تصوير ۾ سائي جي سنترپشن کي تبديل ڪريو. نوٽ ڪريو ته ساڳيءَ طرح اسان ڪري سگھون ٿا، نوان طريقا شامل ڪندي، ٻين ڪمن کي لاڳو ڪري سگھون ٿا: - تيزيءَ کي وڌايو يا بلور - تبديل ڪريو طول و عرض - گھڙيءَ جي طرف/ڪائونٽر ڪلاڪ وار ۾ گھمايو. - ۽ فوٽوشاپ جا ٻيا امڪان :) عام طور تي، تصوير تي ڪنهن به الگورٿم کي لاڳو ڪريو، جيستائين اسان وٽ ڪافي تخيل ۽ ڄاڻ آهي متان (مثال طور، تصوير ۾ ممڪن ٻلين جو تعداد سڃاڻڻ).
ٿورڙو خشڪ نظريو.
اسان راسٽر تصويرن تي غور ڪري رهيا آهيون (اتي پڻ ویکٹر ۽ ٻيا آهن). اهو آهي، جڏهن فائل، هيڊر کان علاوه پاڻ کي خدمت جي معلومات سان گڏ، پوائنٽن جي مستطيل ميٽرڪس کي ذخيرو ڪري ٿو. جديد HD ٽي وي جي اسڪرين وانگر، جنهن جو ريزوليوشن 1920x1080 پکسلز آهي ۽ هر پکسل کي ٽن رنگن جي جزن جي قدرن جي طور تي ظاهر ڪيو ويو آهي: R(ed)، G(reen)، B(lue) = ڳاڙهو، سائو ۽ نيرو. اهي رنگ آزاد آهن ۽ هي ماڊل رنگ جي تصور جي حياتيات مان ورتو ويو آهي. اسان جي اکين ۾ ڪنن ۽ رنڊڪ ​​آهن. ٽن قسمن جا ڪنز (ٽي ويج ڊگھائي حدن مان لاڳاپيل هڪ تي رد عمل)، راڊز رنگ جي روشنيءَ کي ”پراسيس“ ڪندا آهن (روشني جي لهر جي طول و عرض). آر بي بي ماڊل ۾، راڊز جزو جي قيمت لاء ذميوار آهن (0 - غير موجودگي، 255 - سڀ کان وڌيڪ روشني)، ۽ ڪنز - ترتيب سان، جنهن ۾ R / G / B سان لاڳاپيل شدت کي رکڻ لاء. مثال طور: روشنيءَ جي گھٽتائي - راڊ/ڪونز رد عمل نه ٿا ڪن ۽ RGB = (0,0,0). روشن اڇو روشني - سڀئي مخروط هڪجهڙائي سان رد عمل ڪن ٿا، رنڊڪ ​​چريو ٿي وڃن ٿا ۽ RGB = (255,255,255). گرين ماؤس ڊوڙي ويو - سڀني ڪنن هڪجهڙائي سان رد عمل ڪيو، راڊز سراسري طور تي رد عمل ڪيو ۽ RGB = (127,127,127). ڳاڙهو نارنگي - آر ۽ جي لٺ رد عمل ڪن ٿا، لٺيون مشڪل سان جواب ڏين ٿيون، آر جي بي = (30، 30، 0) ...
اچو ته مشق شروع ڪريون.
مون بائٽس سان ڪم ڪرڻ جي مثال لاءِ لکيو آهي، تنهنڪري ڪوڊ سڀني قاعدن جي مطابق پالش نه ڪيو ويو آهي ۽ بهتر کان پري آهي: اسان ان پٽ پيٽرولر کي چيڪ نٿا ڪريون، مڪمل غلطي جي چڪاس نه ڪريو، وغيره. اهو سڌو سنئون اڳتي وڌايو ويو، بغير ريفڪٽرنگ. بنيادي توجہ بائيٽ بٽس سان ڪم ڪري رهيو آهي. اچو ته لکون، جاوا رُش ڪمن سان قياس ڪندي، هڪ ڪنسول يوٽيلٽي، جنهن کي جڏهن ڪمانڊ لائن تي مناسب دليلن سان سڏيو وڃي ٿو، تصوير کي تبديل ڪري ٿو. ماخذ تصوير: ڪَٽي
parameters سان ڪال ڪندي -n kitten.jpg newkitten.jpg تصوير ٺاهيندي: منفي
ڪال ڪندي پيرا ميٽرن سان -b kitten.jpg newkitten.jpg تصوير ٺاهيندي: ڪارو ۽ اڇو kitten
ڪال ڪندي پيرا ميٽرن سان -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