Я не понимаю, как работает класс WritableRaster Java. Я пытался посмотреть документацию, но не понимаю, как она берет значения из массива пикселей. Кроме того, я не уверен, из чего состоит массив пикселей.
Вот поясняю.
То, что я хочу сделать, это: Секретный обмен изображениями Шамира. Для этого мне нужно получить изображение из изображения BuferedImage. Я беру секретный образ. Создайте общие ресурсы, запустив «функцию» для каждого пикселя изображения. (в основном изменяя значения пикселей чем-то)
Фрагмент:
int w = image.getWidth();
int h = image.getHeight();
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
int pixel = image.getRGB(j, i);
int red = (pixel >> 16) & 0xFF;
int green = (pixel >> 8) & 0xFF;
int blue = (pixel) & 0xFF;
pixels[j][i] = share1(red, green, blue);
// Теперь берем эти значения RGB. Я меняю их с помощью некоторой функции и возвращаю значение int. Что-то вроде этого:
public int share1 (r, g, b)
{
a1 = rand.nextInt(primeNumber);
total1 = r+g+b+a1;
new_pixel = total1 % primeNumber;
return new_pixel;
}
// Этот 2d массив пикселей имеет все новые значения цвета, верно? Но теперь я хочу создать изображение, используя эти новые значения. Итак, что я сделал. Сначала преобразовал этот массив пикселей в список. Теперь в этом списке есть значения пикселей нового изображения. Но для создания изображения с использованием метода RasterObj.setPixels() мне нужен массив со значениями RGB [ЗДЕСЬ Я МОГУ ОШИБАТЬСЯ!]. Поэтому я беру отдельные значения списка, нахожу значения rgb и последовательно помещаю их в новый пиксельный вектор массива 1D. ..что-то вроде этого (r1,g1,b1,r2,g2,b2,r3,g3,b3...)
Размер списка wh, так как он содержит значение одного пикселя для каждого пикселя. НО, Размер нового пиксельного вектора массива станет wh*3, так как он содержит значения r,g,b каждого пикселя..
Затем, чтобы сформировать изображение, я делаю это: Фрагмент
BufferedImage image_share1 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
WritableRaster rast = (WritableRaster) image_share1.getData();
rast.setPixels(0, 0, w, h, pixelvector);
image_share1.setData(rast);
ImageIO.write(image_share1,"JPG",new File("share1.jpg"));
Если я помещу массив со значениями только одного пикселя в метод setPixels(), он не вернется из этой функции! Но если я помещу массив с отдельными значениями r, g, b, он вернется из функции. Но делая то же самое для share1 , share 2 и т. д. Я не получаю ничего, кроме оттенков синего. Так что я даже не уверен, что смогу восстановить изображение..
PS - Это может выглядеть как очень глупый код, который я знаю. Но у меня был всего один день, чтобы сделать это и узнать об изображениях в Java. Поэтому я делаю все, что могу.
Спасибо..
x + (y * width)
(вам не нужно использовать формулу, я просто показываю вам, как вы выбираете, к какому пикселю обращаться) - person Dioxin   schedule 10.12.2014