Как извлечь часть этого изображения в Java? [закрытый]

SSRS использует наборы данных для получения данных из базы данных, и каждое поле в наборе данных может отображаться в отчете. Чтобы добавить поле в набор данных, оно должно быть возвращено запросом базового набора данных. Просмотрите свойства набора данных и посмотрите на запрос. Если он имеет форму «выберите a, b, c из таблицы», добавьте нужное поле в список столбцов (a, b, c и т. Д.) Если это хранимая процедура, найдите человека, который может отредактировать эту процедуру, добавив в нее пропущенное поле. После этого обновите список полей для набора данных. Ваше новое поле должно быть использовано в отчете сейчас. Конечно, если вы нарушили SQL для набора данных, вам нужно будет найти человека, который знает базовую базу данных, чтобы помочь вам.

34
задан Glorfindel 5 March 2019 в 17:00
поделиться

2 ответа

Если чтение области спрайтов в a BufferedImage, getSubimage метод может использоваться для получения подызображения листа спрайта.

getSubimage метод возьмет x, y, и width и height из желаемого подызображения, таким образом, желаемый спрайт может быть получен. Так как большинство спрайтов, кажется, тот же размер, я думал бы, что большинство из них может быть получено вложенным for цикл для итерации через большое изображение.

Например, если изображение спрайта загружается с помощью ImageIO класс (такой как read метод), и каждый спрайт 10 пикселей на 10 пикселей в размере, где 5 строк на 5 столбцов спрайтов, спрайты могут быть получены следующим:

BufferedImage bigImg = ImageIO.read(new File("sheet.png"));
// The above line throws an checked IOException which must be caught.

final int width = 10;
final int height = 10;
final int rows = 5;
final int cols = 5;
BufferedImage[] sprites = new BufferedImage[rows * cols];

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        sprites[(i * cols) + j] = bigImg.getSubimage(
            j * width,
            i * height,
            width,
            height
        );
    }
}

Выгода, конечно, вышеупомянутый код будет только работать, если все спрайты будут тем же размером, таким образом, должна будет быть некоторая корректировка, выполненная для работы на данный лист спрайта. (Поскольку правый верхний угол, кажется, отличается в размере от других.)

49
ответ дан 27 November 2019 в 16:46
поделиться

Если Вы просто хотите потянуть спрайты, Графический класс Java имеет drawImage метод, который вытащит определенную область изображения для Вас. Просто необходимо указать исходное изображение, где Вы хотите потянуть спрайт на своем Графическом объекте (x, y, ширина, высота), и в том, какой кадр изображения спрайт расположен (x, y, ширина, высота).

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

void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y,
                     int columns, int frame, int width, int height)
{
    int frameX = (frame % columns) * width;
    int frameY = (frame / columns) * height;
    g2d.drawImage(source, x, y, x+width, y+height,
                  frameX, frameY, frameX+width, frameY+height, this);
}

columns то, сколько столбцов там находится в Вашем листе спрайта. Первые две строки метода вычисляют x любое y положение кадра спрайта в Вашем листе.

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

Если бы Ваш лист спрайта был регулярным листом (все спрайты тот же размер), и он был расположен в шаблоне 5 x 15, как Ваш, то Вы потянули бы 20-й кадр со следующим вызовом метода

Toolkit tk = Toolkit.getDefaultToolkit();    
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);

Здесь, X и Y являются положением, Вы хотите потянуть спрайт на своем Графическом объекте, 15 число столбцов в Вашем листе спрайта, 19 кадр (нумерация запускается в 0), и 25 ширина и высота каждого спрайта (я приблизился).

12
ответ дан 27 November 2019 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: