Jump to content
  • 0

Как найти пиксель отличного от задонного цвета?


stars
 Share

Question

Есть у меня есть картинка посредине примерно нарисован круг http://s54.radikal.ru/i144/1004/b1/7cebf43b0a31.jpg есть какойнить скрипт или функция например пхп чтобы узнать его ширину? То есть у меня есть картинка мне необходимо обрезать белый фон и узнать ширину того что останется.

Насколько я понимаю по средствам gdi набора функций можно находить пиксили отличного цвета, может ктонить подсказать как это делать?(какойнить пример маленький)

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

"Примерно круг" называется "эллипс". Что значит "отличные цвета" - фон однородный или разноцветный? Если однородный, то белый или любой? Какая вообще конечная задача?

Link to comment
Share on other sites

  • 0

фон белый конечная задача получить ширину изображения, именно изображения, а не картинки. допустим у меня есть монета, я знаю что ее диаметр равен 100px на картинке она явно меньше так вот мне надо узнать ширину монеты и дальше я уже смогу пропорционально увеличить или уменьшить ее до ее реальной величены...

собственно у меня уже появилась идея что это сделать посредствам GD то есть у меня картинка например 400х300 px это значит 300 строк по 400 пикселей мне надо ловить первый и последний пиксель в строке где imagecolorat($img, $x, $y) != #ffffff, и потом сопоставлять значения в строках...

Edited by stars
Link to comment
Share on other sites

  • 0

иди сверху вниз вдоль каждой x-координаты, смещаясь слева направо после каждого прохода, когда дойдёшь до чёрного, начинай идти справа налево от правого края. Когда и там дойдёшь до чёрного, то разница в координатах - искомая величина. Существенно сэкономишь время.

Edited by Int
Link to comment
Share on other sites

  • 0

Написал вот такой код, а он не работает (

вот картинка http://i003.radikal.ru/1004/82/6bcc0d229705.jpg

<?php
$source_src='1.jpg';
$params = getimagesize($source_src);
$picsX = 0;
$picsY = 0;
$defcolor = 0;
$minX = 999999999999999;
if ($picsX <= $params[0]) {
if ($picsY <= $params[0]) {
$color = imagecolorat($source_src, $picsX , $picsY);
if ($color != $defcolor){
if ($minX > $picsX) {
$minX = $picsX;
}
}
$picsY++;
}
$picsX++;
}
echo $minX;
?>

GD Version bundled (2.0.34 compatible) Поддержка GIF JPG PNG работает

Edited by stars
Link to comment
Share on other sites

  • 0

if ($picsY <= $params[0]) {

$picsY++;

}

можно было заменить на просто while ($picsY++ <= $params[1]) {}

Кстати, ничего, что и у X и у Y сравнение с $params[0]? Я особо-то в логику не вникал, но вроде чё-то не то.

Эта штука ищет только левый край?

А ещё я не вижу цикла.

И если будет цикл, то нужен будет и выход из него не забыть сразу, как только найден пиксель.

Edited by Int
Link to comment
Share on other sites

  • 0

я все таки домучал ))

в целом получилось так

<?php
$f = 'img';
$src = imagecreatefromjpeg($f);
$x = imagesx($src);
$y = imagesy($src);
imagefilter($src, IMG_FILTER_GRAYSCALE);
imagefilter($src, IMG_FILTER_EDGEDETECT);
$asd = 0;
$k = 0;
$p = 0;
$asd = 0;
for ($n = 0; $n < $x; $n++) {
for ($i = 0; $i < $y; $i++) {
$imgtest = imagecolorat($src,$n,$i);
if ($imgtest==$asd) { $k = 1; $y0 = $i; break;}
}
if ($k == 1) { $x0 = $n; break; }
}
$xn = $x-1;
$yn = $y-1;
for ($n = $xn; $n > 0; $n--) {
for ($i = $yn; $i > 0; $i--) {
$imgtest = imagecolorat($src,$n,$i);
if ($imgtest==$asd) { $p = 1; $y1 = $i; break; }
}
if ($p == 1) { $x1 = $n; break; }
}
$imgtest = imagecolorat($src,1018,622);
imagedestroy($src);
$fft = imagecreatefromjpeg($f);
$size_x = $x-$x0-($x-$x1);
$size_y = $y;
$im2=imagecreatetruecolor($size_x,$size_y);
imageCopy($im2,$fft,0,0,$x0,0,$size_x,$size_y);
imagedestroy($fft);
header('Content-Type: image/jpeg;');
imagejpeg($im2);
imagedestroy($im2);
?>

Готовый пример http://www.toolscraft.ru/content/triming/

картинка для теста === http://www.toolscraft.ru/content/triming/1.jpg

Работает нормально когда фон заметно отличается от картинки...

Edited by stars
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy