Lucu sekali Anda menanyakan hal ini, saya baru saja melakukan ini untuk situs pekerjaan saya dan saya berpikir saya harus menulis tutorial ... Berikut adalah cara melakukannya dengan PHP / Imagick, yang menggunakan ImageMagick:
$usmap = '/path/to/blank/us-map.svg';
$im = new Imagick();
$svg = file_get_contents($usmap);
/*loop to color each state as needed, something like*/
$idColorArray = array(
"AL" => "339966"
,"AK" => "0099FF"
...
,"WI" => "FF4B00"
,"WY" => "A3609B"
);
foreach($idColorArray as $state => $color){
//Where $color is a RRGGBB hex value
$svg = preg_replace(
'/id="'.$state.'" style="fill:#([0-9a-f]{6})/'
, 'id="'.$state.'" style="fill:#'.$color
, $svg
);
}
$im->readImageBlob($svg);
/*png settings*/
$im->setImageFormat("png24");
$im->resizeImage(720, 445, imagick::FILTER_LANCZOS, 1); /*Optional, if you need to resize*/
/*jpeg*/
$im->setImageFormat("jpeg");
$im->adaptiveResizeImage(720, 445); /*Optional, if you need to resize*/
$im->writeImage('/path/to/colored/us-map.png');/*(or .jpg)*/
$im->clear();
$im->destroy();
langkah-langkah penggantian warna regex dapat bervariasi tergantung pada jalur svg xml dan cara Anda menyimpan nilai id & warna. Jika Anda tidak ingin menyimpan file di server, Anda dapat menampilkan gambar sebagai basis 64 seperti
<?php echo '<img src="data:image/jpg;base64,' . base64_encode($im) . '" />';?>
(sebelum Anda menggunakan hapus / hancurkan) tetapi memiliki masalah dengan PNG sebagai base64 jadi Anda mungkin harus mengeluarkan base64 sebagai jpeg
Anda dapat melihat contoh di sini yang saya lakukan untuk peta wilayah penjualan perusahaan sebelumnya:
Mulai: https://upload.wikimedia.org/wikipedia/commons/1/1a/Blank_US_Map_(states_only).svg
Selesai:
Edit
Sejak menulis di atas, saya telah menemukan 2 teknik yang ditingkatkan:
1) alih-alih loop regex untuk mengubah status isian, gunakan CSS untuk membuat aturan gaya seperti
<style type="text/css">
#CA,#FL,HI{
fill:blue;
}
#Al, #NY, #NM{
fill:#cc6699;
}
/*etc..*/
</style>
dan kemudian Anda dapat melakukan satu penggantian teks untuk memasukkan aturan css Anda ke dalam svg sebelum melanjutkan dengan pembuatan imagick jpeg / png. Jika warna tidak berubah, periksa untuk memastikan Anda tidak memiliki gaya isian sebaris di tag jalur Anda yang menggantikan css.
2) Jika Anda tidak harus benar-benar membuat file gambar jpeg / png (dan tidak perlu mendukung browser lama), Anda dapat memanipulasi svg langsung dengan jQuery. Anda tidak dapat mengakses jalur svg saat menyematkan svg menggunakan img atau tag objek, jadi Anda harus langsung menyertakan svg xml di halaman web Anda html seperti:
<div>
<?php echo file_get_contents('/path/to/blank/us-map.svg');?>
</div>
lalu mengubah warnanya semudah:
<script type="text/javascript" src="/path/to/jquery.js"></script>
<script type="text/javascript">
$('#CA').css('fill', 'blue');
$('#NY').css('fill', '#ff0000');
</script>