2012-05-24 2 views
0

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

Для удовлетворения этой потребности я планирую пикселировать часть изображения. Как я могу пометить изображение таким образом, чтобы скрыть координаты области и размер области.

Я узнал, как pixelate (путем масштабирования изображения вниз и вверх), но как я могу ориентировать только область изображения?

Площадь определяется двумя парами координат (x1, y1, x2, y2) или двумя координатами и размерами (x, y, width, height).

ответ

1

Я нахожусь в данный момент, поэтому не могу проверить код. Я бы посмотрел, можете ли вы работать с -region или использовать маску. Скопируйте изображение и изображение в пиксели, создайте маску требуемой области, вырежьте отверстие в исходном изображении с помощью маски и наложите его на пикселированное изображение.

Example of masking an image

Вы можете изменить этот код (довольно старый и, вероятно, может быть улучшен на):

// Get the image size to creat the mask 
// This can be done within Imagemagick but as we are using php this is simple. 
$size = getimagesize("$input14"); 

// Create a mask with a round hole 
$cmd = " -size {$size[0]}x{$size[1]} xc:none -fill black ". 
" -draw \"circle 120,220 120,140\" "; 
exec("convert $cmd mask.png"); 

// Cut out the hole in the top image 
$cmd = " -compose Dst_Out mask.png -gravity south $input14 -matte "; 
exec("composite $cmd result_dst_out1.png"); 

// Composite the top image over the bottom image 
$cmd = " $input20 result_dst_out1.png -geometry +60-20 -composite "; 
exec("convert $cmd output_temp.jpg"); 

// Crop excess from the image where the bottom image is larger than the top 
$cmd = " output_temp.jpg -crop 400x280+60+0 "; 
exec("convert $cmd composite_sunflower_hard.jpg "); 

// Delete tempory images 
unlink("mask.png"); 
unlink("result_dst_out1.png"); 
unlink("output_temp.jpg"); 
1

Спасибо за ваш ответ, Bonzo.

Я нашел способ добиться того, чего хочу с помощью ImageMagick convert. Это трехэтапный процесс:

  1. Я создаю пиксельную версию всего исходного изображения.
  2. Затем я создаю маску, используя исходное изображение (чтобы сохранить тот же размер), заполненный черным (с gamma 0), затем я рисую пустой прямоугольник, где я хочу нечитаемые области.
  3. Затем я объединяю три изображения (оригинал, пиксель и маска) в составной операции.

Вот пример, в котором две области (a и b) неровны.

 
convert original.png -scale 10% -scale 1000% pixelated.png 
convert original.png -gamma 0 -fill white -draw "rectangle X1a, Y1a, X2a, Y2a" -draw "rectangle X1b, Y1b, X2b, Y2b" mask.png 
convert original.png pixelated.png mask.png -composite result.png 

Он работает как очарование. Теперь я сделаю это с RMagick.

Смежные вопросы