Java, как сделать PNG из списка координат x, y - PullRequest
0 голосов
/ 06 июня 2018

У меня есть данные (в конечном итоге, координаты (удваиваются)), которые выглядят так:

x,y
===
1.1,2.3
2.9,5.4
7.9,8.1

Мне нужно создать простой PNG из этих координат, который показывает эти координаты в виде черных точек на беломфон (потом я подправлю цвета позже).

Я много гуглил, и я не очень хорошо знаком с "вещами" с изображениями на Java, поэтому мне было интересно, сможет ли кто-нибудь помочь.

Это то, что я нашел до сих пор, но я не могу использовать двойные с этим, и я не вижу, как обойти это в данный момент.Я пытаюсь держаться подальше от внешних библиотек по причинам, связанным с окружающей средой.

final BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);   

 final Graphics2D graphics2D = image.createGraphics();
    graphics2D.setPaint(Color.WHITE);
    graphics2D.fillRect(0, 0, 1000, 1000);
    graphics2D.setPaint(Color.BLACK);
    graphics2D.drawOval(0, 0, 1000, 1000);
    graphics2D.dispose();

У кого-нибудь есть совет?

1 Ответ

0 голосов
/ 07 июня 2018

Я бы предложил вам использовать boolean[][] для хранения ваших пикселей.Использование двойников для хранения ваших координат - ужасная трата памяти.Я бы рекомендовал следующий подход:

boolean[][] pixBool;
BufferedImage img;

for(int a = 0; a < pixBool.length;a++){
    for(int b = 0; b < pixBool[0].length;b++){
        boolean pix = pixBool[a][b];
        if(pix){
            img.setRGB(a,b,0xff000000);  
        }
    }
}

В этом случае белый (0xffffffff) пиксель будет сохранен в массиве pixBool как ложный, тогда как черный (0xff000000) будет сохранен как истинный.Таким образом, после инициализации массива все изображение будет белым (фон).Изображение будет создано путем манипулирования пикселями заданного BufferedImage с помощью метода setRGB().

Если вам действительно нужно работать с двойными числами, вы можете преобразовать их и затем использовать вышеупомянутый метод:

double[] coordinates;
for(int c = 0; c < coordinates.length; c++){
    double coord = coordinates[c];
    BigDecimal x = BigDecimal.valueOf((int)coord);
    BigDecimal y = BigDecimal.valueOf(coord);
    y = y.subtract(x);
    y = y.scaleByPowerOfTen(y.scale);
    pixBool[(int)x.longValue()][(int)y.longValue()] = true;
}

Чтобы извлечь координату x, вам просто нужно извлечь всю часть двойного числа, что можно легко сделать, преобразовав ее в int и, таким образом, потеряв дробную часть.Координата Y является сложной частью.Вы должны использовать класс BigDecimal из-за неопределенности double.Сначала вы должны извлечь дробную часть числа, потому что там хранятся ваши координаты.Это может быть достигнуто путем вычитания всей части числа.После этого вы должны масштабировать извлеченную дробную часть, чтобы получить целое число.Это делается путем умножения на 10 до степени количества цифр после точки (метод шкалы).После этого вам просто нужно извлечь вычисленные числа из класса BigDecimal, и вы закончите.

Вы также можете использовать более тупой подход с использованием класса String:

double[] coordinates;
for(int c = 0; c < coordinates.length; c++){
    double coord = coordinates[c];
    String temp = String.valueOf(coord);
    String [] temp2 = temp.split(".");
    int x = Integer.valueOf(temp2[0]);
    int y = Integer.valueOf(temp[1]);
    pixBool[x][y] = true;
}

В этомВ этом случае вы сначала конвертируете свою координату в String, а затем разбиваете ее вокруг десятичной точки.Это даст вам String[] с двумя записями: целая часть вашего числа (она же координата x) и дробная часть (она же координата y).Затем вам просто нужно преобразовать строки обратно в int, а затем использовать их для заполнения логического [].

...