0

私のアプリケーション ユーザーは写真をアップロードできます。場合によっては、写真の一部の情報、たとえば車両のナンバー プレートや請求書の個人住所などを隠してもらいたいことがあります。

そのニーズを満たすために、画像の一部をピクセル化する予定です。非表示にする領域の座標と領域のサイズを指定して、どのように画像をピクセル化できますか。

(画像を縮小および拡大することによって)ピクセル化する方法を見つけましたが、どうすれば画像の領域のみをターゲットにできますか?

領域は、座標の 2 つのペア (x1、y1、x2、y2)、または座標と寸法のペア (x、y、幅、高さ) によって指定されます。

4

2 に答える 2

1

答えてくれてありがとう、ボンゾ。

convertImageMagickコマンドで私が望むことを達成する方法を見つけました。これは3ステップのプロセスです。

  1. ソース画像全体のピクセル化されたバージョンを作成します。
  2. 次に、元の画像(同じサイズを維持するため)を黒(で)で塗りつぶしてマスクを作成し、gamma 0判読できない領域が必要な場所に空白の長方形を描画します。
  3. 次に、3つの画像(元の画像、ピクセル化された画像、マスク)を合成操作でマージします。

これは、2つの領域(aとb)がピクセル化された例です。

変換original.png-scale10%-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
original.png pixelated.png mask.png-compositeresult.pngを変換します

それは魅力のように機能します。今度はRMagickでやります。

于 2012-05-24T08:06:47.917 に答える
1

私は現在仕事をしているので、コードをテストできません。-regionを使用するか、マスクを使用できるかどうかを確認します。画像をコピーして画像全体をピクセル化し、必要な領域のマスクを作成し、マスクを使用して元の画像に穴を開け、ピクセル化された画像にオーバーレイします。

画像のマスキングの例

このコードを変更することができます(かなり古く、おそらく改善される可能性があります):

// 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");  
于 2012-05-24T07:09:53.027 に答える