Получение пиксельных данных из изображения с помощью Java

Злоупотребление статическими классами можно считать плохой практикой. Но так же может злоупотреблять любой языковой особенностью.

Я не делаю различий между нестатическим классом, содержащим только статические методы, и статическим классом. По сути, это одно и то же, за исключением того, что статические классы позволяют компилятору реализовывать намерения разработчиков (отсутствие создания экземпляров этого класса, удобный синтаксис для доступа к его функциям, и т. Д. ).

Как вы говорите, распространение классов «Помощник» может привести к неприятностям (дизайн, ремонтопригодность, удобочитаемость, обнаруживаемость, другие способности ...). Здесь нет аргументов. Но можете ли вы утверждать, что класс «Помощник» никогда не подходит? Я сомневаюсь в этом.

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

  • Статический класс Enumerable предоставляет набор методов расширения, которые полюбили большинство из нас. Это логический набор функциональности / бизнес-логики, который не связан ни с каким конкретным типом.
  • Услуги, предоставляемые средой / контекстом: например, ведение журнала, настройка (иногда)
  • Другие (о которых я не могу думать в данный момент:))

Так что нет Вообще это не плохая практика. Просто используйте их с умом ...

15
задан Girish Nair 17 April 2013 в 10:15
поделиться

5 ответов

Это:

for(int i = 0; i < img.getHeight(); i++){
    for(int j = 0; j < img.getWidth(); j++){
        rgb = getPixelData(img, i, j);

Не совпадает с этим:

private static int[] getPixelData(BufferedImage img, int x, int y) {

У вас есть i подсчет строк и j столбцы, то есть i содержит y значений, а j содержит x значений. Это наоборот.

т.е. i содержит y значений, а j содержит x значений. Это наоборот.

т.е. i содержит y значений, а j содержит x значений. Это наоборот.

12
ответ дан 1 December 2019 в 02:29
поделиться

Вы должны изменить:

for(int i = 0; i < img.getHeight(); i++){
    for(int j = 0; j < img.getWidth(); j++){
        rgb = getPixelData(img, i, j);

На

for(int i = 0; i < img.getWidth(); i++){
    for(int j = 0; j < img.getHeight(); j++){
        rgb = getPixelData(img, i, j);

Поскольку второй параметр из getPixelData - это значение x , а третье - это y -значение. Вы переключили параметры.

2
ответ дан 1 December 2019 в 02:29
поделиться

Я искал ту же способность. Не хотелось перечислять все изображение, поэтому я немного поискал и использовал PixelGrabber.

Image img = Toolkit.getDefaultToolkit().createImage(filename);
PixelGrabber pg = new PixelGrabber(img, 0, 0, -1, -1, false);

pg.grabPixels(); // Throws InterruptedException

width = pg.getWidth();
height = pg.getHeight();

int[] pixels = (int[])pg.getPixels();

Вы можете использовать int [] прямо здесь, пиксели находятся в формате, продиктованном ColorModel из pg.getColorModel () , или вы можете изменить это false на true и заставить его быть RGB8-in-ints.

С тех пор я обнаружил, что классы Raster и Image тоже могут это делать, а в javax.imageio. * было добавлено несколько полезных классов.

BufferedImage img = ImageIO.read(new File(filename)); // Throws IOException
int[] pixels = img.getRGB(0,0, img.getWidth(), img.getHeight, null, 0, img.getWidth());

// also available through the BufferedImage's Raster, in multiple formats.
Raster r = img.getData();
int[] pixels = r.getPixels(0,0,r.getWidth(), r.getHeight(), (int[])null);

Есть несколько методов getPixels (...) в Raster .

5
ответ дан 1 December 2019 в 02:29
поделиться

int argb = img.getRGB (x, y); Ваш код

int argb = img.getRGB (y, x); мои изменения теперь работают

3
ответ дан 1 December 2019 в 02:29
поделиться

Почему не использовать просто использовать:

public int[] getRGB(int startX,
                    int startY,
                    int w,
                    int h,
                    int[] rgbArray,
                    int offset,
                    int scansize)

Он встроен, чувак.

1
ответ дан 1 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

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