Можно ли разделить пиксель на меньшие?Или возможно иметь 1,54 пикселя вместо 1 или 2? - PullRequest
0 голосов
/ 27 декабря 2018

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

Пиксель - это 24 бита в файле BMP, верно?Поскольку это RGB, то есть 1 байт для красного, 1 байт для зеленого и 1 байт для синего.Так как же мне разделить пиксель?Например, если у меня 2,67, то 0,67, как это будет работать?Разделение пикселя означает деление 3 байтов, но есть предел того, как я могу их разделить, также RGB исчезнет, ​​потому что если бы я разделил на половину, то у меня было бы только 12 бит, недостаточно для хранения RGB.

Также, когда я копирую пиксель за пикселем, возможно ли копировать вместо пикселя за пикселем, чтобы каждый раз копировать 0,01 пикселя?Это означает, что если мне потребуется 1 шаг, чтобы скопировать 1 пиксель (1 пиксель за раз), то, если я копирую 0,01 пикселя каждый раз, это означает, что мне потребуется 100 раз, чтобы скопировать целый пиксель.Это звучит совершенно странно для меня, потому что копирование 0,01 пикселя за раз означает копирование 0,01 байта за раз, и это может испортить изображение, если я изменяю размер (я думаю).

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

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Не думаю, что вас просят разделить отдельный пиксель.Похоже, вас просят добавить или удалить пиксели при изменении размера изображения.Например, предположим, что у вас есть изображение размером 12 x 12 пикселей, и вам предоставляется коэффициент 1,3 для увеличения.Это дает новое изображение размером 15,6 x 15,6, которое округляется до 16 x 16.

Затем необходимо выполнить сопоставление пикселей исходного изображения с пикселями в измененном изображении.Простой способ сделать это - взять координаты x и y большего изображения и умножить их (или разделить) на коэффициент масштабирования, чтобы получить соответствующие координаты на меньшем изображении, а затем скопировать весь пиксель из старого вновое изображение.Учитывая приведенный выше пример, пиксель (13,14) в увеличенном изображении соответствует x = 13 / 1,3 = 10 и y = 14 / 1,3 = ~ 10,76 (округляется до 11), поэтому скопируйте пиксель (10,11) в старомизображение к (13,14) в новом изображении.

0 голосов
/ 27 декабря 2018

@ dbush было очень ясно.Но вы также можете сделать более глубокий масштабный алгоритм с этими двумя наблюдениями.

Наблюдение 1

В примере @dbush он пытается расширить 12 x 12 до 16 x 16, потому что 15,6 x 15,6невозможно сделать (так как пиксели являются дискретной единицей).Но благодаря этому масштабный коэффициент больше не равен 1,3, а равен 16/12 = 1,333333333333333.Таким образом, вы можете использовать это число для внесения корректировок, которые он говорит.

Наблюдение 2

В примере @dbush пиксель (13, 14) (я полагаю, считает пиксели от 0 до 15)сопоставляется с пикселем (10, 10,76).Поскольку этот пиксель не существует, он округляет свои координаты, чтобы использовать (10, 11) вместо этого.Но (10, 10.76) представляет координату верхнего левого угла маленького прямоугольника внутри исходного изображения.Обычный пиксель - это квадрат размером 1 x 1. Но этот маленький прямоугольник имеет размер пикселя, масштабированный с тем же коэффициентом 1,3.Размер этого маленького прямоугольника составляет 1 / 1,3 = 0,78 (приблизительно).Это означает, что у этого маленького прямоугольника есть его правый нижний угол в (10.78, 11.54).

Этот маленький прямоугольник, который должен быть сопоставлен с новым изображением, имеет 11 - 10,76 = 0,24 единицы его высоты внутри пикселя (10, 10) и 11,54 - 11 = 0,54 единицы его высоты внутри пикселя (10, 11).Таким образом, значения RGB для нового пикселя должны быть взвешенной суммой значений RGB пикселей (10, 10) и (10, 11) с использованием 0,24 и 0,54 в качестве весов соответственно.Это даст вашему коду возможность масштабировать изображения с коэффициентом, меньшим 1.

Примечания

  • Я использовал слово «прямоугольник», потому что рассматривал тот факт, что изображение может иметькоэффициент масштабирования по горизонтали, отличный от коэффициента масштабирования по вертикали.В данном конкретном случае масштаб был равен 1,3 как для горизонтального, так и для вертикального.
  • Взвешенная сумма использует только высоту в качестве весов, поскольку маленький прямоугольник пересекает только 2 пикселя по вертикальной оси.Случилось так, что по горизонтальной оси маленький прямоугольник был внутри одного пикселя.Но может быть сценарий, когда прямоугольник будет пересекать пиксель как по горизонтали, так и по вертикали, или даже пересекать более 2 пикселей по одной оси.Таким образом, взвешенная сумма должна быть готова учитывать более 2 пикселей на одной оси и использовать области вместо ширины или высоты, если обе оси рассматриваются для одного прямоугольника.
0 голосов
/ 27 декабря 2018

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

...