Злоупотребление статическими классами можно считать плохой практикой. Но так же может злоупотреблять любой языковой особенностью.
Я не делаю различий между нестатическим классом, содержащим только статические методы, и статическим классом. По сути, это одно и то же, за исключением того, что статические классы позволяют компилятору реализовывать намерения разработчиков (отсутствие создания экземпляров этого класса, удобный синтаксис для доступа к его функциям, и т. Д. ).
Как вы говорите, распространение классов «Помощник» может привести к неприятностям (дизайн, ремонтопригодность, удобочитаемость, обнаруживаемость, другие способности ...). Здесь нет аргументов. Но можете ли вы утверждать, что класс «Помощник» никогда не подходит? Я сомневаюсь в этом.
Действительно, ответственное использование статических классов может иметь большие преимущества для вашего кода:
Enumerable
предоставляет набор методов расширения, которые полюбили большинство из нас. Это логический набор функциональности / бизнес-логики, который не связан ни с каким конкретным типом. Так что нет Вообще это не плохая практика. Просто используйте их с умом ...
Это:
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 значений. Это наоборот. Вы должны изменить:
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
-значение. Вы переключили параметры.
Я искал ту же способность. Не хотелось перечислять все изображение, поэтому я немного поискал и использовал 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
.
int argb = img.getRGB (x, y);
Ваш код
int argb = img.getRGB (y, x);
мои изменения теперь работают
Почему не использовать просто использовать:
public int[] getRGB(int startX,
int startY,
int w,
int h,
int[] rgbArray,
int offset,
int scansize)
Он встроен, чувак.