2016-12-31 10 views
0

Я не могу найти решение для моей проблемы, надеюсь, что вы можете мне помочь. У меня есть буферное изображение (например, img), и я хочу изменить его размер (с его массивом пикселей), чтобы он соответствовал точно 100px (100 x 100). Все решения, которые я нашел, предназначены только для «растяжения» изображения при рисовании, но мне действительно нужен массив. Я думал об алгоритме и попытался это одно:BufferedImage алгоритм изменения размера

BufferedImage resized = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB); 
     for(int i = 0; i < img.getWidth(); i++){ 
      for(int j = 0; j < img.getHeight(); j++){ 
       resized.setRGB(i*(100/img.getWidth()), j*(100/img.getHeight()), img.getRGB(i, j)); 
      } 
     } 

Я не могу объяснить это (ну, не на английском языке), что он делает, но я думаю, что вы можете видеть это легко (для каждого пикселя в исходном изображении (img), поместил его в новый BufferedImage (измененный размер) в постинге (коэффициент статической позиции *). (надеюсь, это было хорошее описание). Но, однако, он не работает, я получаю только нули :( Может кто-нибудь скажите мне, что изменить или дать мне другой пример для алгоритма? (не имеет значения, насколько это быстро, если я это понимаю)

(Я действительно надеюсь, что это не repost, потому что я действительно не мог f Ind другая проблема/решение, которое направлено на изменение размера массива: /)

Приветствия :)

+1

Я не специалист по изображениям, но я думаю, что вы проделаете это несколько назад. Попробуйте выполнить «i» и «j» над индексами «resized» от 0 до 100. Затем установите «resized [i] [j]» в один из пикселей из «img», используя ваши коэффициенты масштабирования. –

+0

Является ли это дубликатом этого вопроса? http://stackoverflow.com/questions/9417356/bufferedimage-resize –

+0

Даже если вам «действительно нужен массив» (который я не вижу, почему, из вашего кода), будет гораздо быстрее * просто использовать ' AffineTransformOp' и проведите изображение вниз, используя 'TYPE_NEAREST_NEIGHBOR'.Вы все равно можете получить массив поддержки из полученного изображения, если вам нужно. – haraldK

ответ

1

Давайте посмотрим на вашу проблему только в одном измерении. Для каждого столбца i в исходном изображении шириной owidth вы хотите найти столбец ii в новом изображении шириной nwidth, в вашем случае 100. Вы вычислить ii так:

ii = i * (nwidth/owidth); 

формула хороша в принципе , но скобки гарантируют, что сначала рассчитывается рацион nwidth/owidth. Поскольку вы уменьшаете масштаб, это соотношение меньше единицы. Поскольку и nwidth, и owidth являются целыми числами, деление является целым делением, результатом которого также должно быть целое число. Здесь он равен нулю.

Вы можете исправить это двумя способами: сделать Деление деление с плавающей точкой:

ii = i * (1.0 * nwidth/owidth); 

или просто удалить скобки так, что умножение происходит первая:

ii = i * nwidth/owidth; 

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

Наконец, Джеймс К Полк прав: у вас есть логика неправильного пути д. Посетите каждый пиксель нового изображения с помощью петель for и выберите исходный пиксель из старого изображения для каждого пикселя в новом изображении. (Это также означает, что отношение отменено.)

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

+0

большое вам спасибо! действительно помог мне :) – Mechamod