基于已在图像上绘制的现有选择/路径裁剪/剪切图像(理想情况下通过PHP)

时间:2014-03-11 02:02:05

标签: php image-processing

我在互联网上搜索了一下,我似乎无法找到任何关于我试图实现的内容......我担心这意味着我可能会采取错误的做法,但是无论如何我会在这里提出这个问题,希望也许我不是。

我想拍摄已经生成的图像,该图像已经通过特定颜色和动态(但总是矩形)路径绘制了矩形选区,并裁剪或剪切(并使用)其内部区域矩形路径。 我们使用谷歌地图生成的图像作为示例:Google Maps Image Example

我想也许imagemagick库会为此提供一个解决方案,但是,我不知道是不是因为我没有完全缩小我正在寻找的确切关键术语,或者是因为它不能(至少不是简单地)完成,但我没有找到任何解决方案。

欢迎提出任何解决方案,建议或打击。

[请注意(暂时)我想在假设这些图像已经存在的情况下进行操作,因此不存在关于图像上相对选择区域的像素坐标的任何信息]

1 个答案:

答案 0 :(得分:1)

您的问题似乎归结为:如何在图片中找到红色矩形?

这是一个非常开放的问题,实际上可能很难解决。但是,如果可以做出以下假设,那么任务将变得更加容易:

  • 矩形以纯RGB红色(#ff0000)绘制。
  • 矩形与图像边缘平行对齐。
  • 图像以PNG等无损格式保存。
  • 图像不包含此确切颜色的其他像素。
  • 我们知道矩形边缘的宽度。

您提供的示例似乎勾选了所有这些框。由于它被存储为8位索引彩色图像,因此第一步是将其转换为真彩色图像。这样可以更轻松地检查像素值。

然后找到框架的最外边缘,按框架宽度插入坐标,然后裁剪图像。这里有一些代码可以帮到你:

<?php

$src_img = 'er7RT.png';
$frame_color = 0xff0000;
$frame_width = 6;

// Load image and copy to true color image resource
$im = imagecreatefrompng($src_img);
$sw = imagesx($im);
$sh = imagesy($im);
$im1 = imagecreatetruecolor($sw, $sh);
imagecopy ($im1, $im, 0, 0, 0, 0, $sw, $sh);
imagedestroy($im);

// Get outer dimensions of frame.
// Assume the frame color appears nowhere else in the image.
$minx = $miny = 999999;
$maxx = $maxy = -$minx;
for ($x=0; $x<$sw; $x++) for ($y=$sh/20; $y<$sh; $y+=$sh/10) {
  if (imagecolorat($im1,$x,$y)==$frame_color) { $minx = $x; break 2; }
}
for ($x=$sw-1; $x>=0; $x--) for ($y=$sh/20; $y<$sh; $y+=$sh/10) {
  if (imagecolorat($im1,$x,$y)==$frame_color) { $maxx = $x; break 2; }
}
for ($y=0; $y<$sh; $y++) for ($x=$sw/20; $x<$sw; $x+=$sw/10) {
  if (imagecolorat($im1,$x,$y)==$frame_color) { $miny = $y; break 2; }
}
for ($y=$sh-1; $y>=0; $y--) for ($x=$sw/20; $x<$sw; $x+=$sw/10) {
  if (imagecolorat($im1,$x,$y)==$frame_color) { $maxy = $y; break 2; }
}
if ($minx>=$maxx || $miny>=$maxy) die("Couldn't locate frame");

// Subtract frame width to obtain crop region
$minx += $frame_width;
$maxx -= $frame_width;
$miny += $frame_width;
$maxy -= $frame_width;

// Create new image with cropped dimensions
$im2 = imagecreatetruecolor($maxx-$minx, $maxy-$miny);
imagecopy ($im2, $im1, 0, 0, $minx, $miny, $maxx-$minx, $maxy-$miny);

// Finish up
header("Content-Type: image/png");
imagepng($im2);
imagedestroy($im1);
imagedestroy($im2);