我在互联网上搜索了一下,我似乎无法找到任何关于我试图实现的内容......我担心这意味着我可能会采取错误的做法,但是无论如何我会在这里提出这个问题,希望也许我不是。
我想拍摄已经生成的图像,该图像已经通过特定颜色和动态(但总是矩形)路径绘制了矩形选区,并裁剪或剪切(并使用)其内部区域矩形路径。 我们使用谷歌地图生成的图像作为示例:
我想也许imagemagick库会为此提供一个解决方案,但是,我不知道是不是因为我没有完全缩小我正在寻找的确切关键术语,或者是因为它不能(至少不是简单地)完成,但我没有找到任何解决方案。
欢迎提出任何解决方案,建议或打击。
[请注意(暂时)我想在假设这些图像已经存在的情况下进行操作,因此不存在关于图像上相对选择区域的像素坐标的任何信息]
答案 0 :(得分:1)
您的问题似乎归结为:如何在图片中找到红色矩形?
这是一个非常开放的问题,实际上可能很难解决。但是,如果可以做出以下假设,那么任务将变得更加容易:
#ff0000
)绘制。您提供的示例似乎勾选了所有这些框。由于它被存储为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);