目前我有一个图像,我正在从中检索背景颜色。我正在使背景颜色透明,然后尝试将其与原始图像进行比较以确定由所述背景颜色组成的图像的百分比。这是我尝试使用的代码:
$image = new Imagick($file);
// Make bg transparent for comparison
$tpImage = $image->clone();
$tpImage->setFormat('png');
$tpImage->setImagePage(0, 0, 0, 0);
$swatch_pixel = $tpImage->getImagePixelColor(1, 1);
$tpImage->paintTransparentImage($swatch_pixel, 0, 65535 * 0.1);
$image->SetOption('fuzz', '2%');
$result = $image->compareImages($tpImage, Imagick::METRIC_ABSOLUTEERRORMETRIC);
echo $result[0];
目前这总是返回 0...我不确定我是否需要使用不同的比较方法或什么,或者如果我做错了什么,我已经花了很多时间在这个和大部分我找到的资源很旧。
最佳答案
更新的答案
实际上,既然您已明确指出,那么当唯一的区别是透明度时,ABSOLUTE_ERROR 指标将不起作用。
要回答您的问题,您可能只想使用以下方法分离出 alpha channel :
separateImageChannel(Imagick::CHANNEL_ALPHA);
然后得到它的统计平均值,它会告诉你有多少像素是白色的——即透明的。
我将在下面保留原始答案,因为它是一种有用的技术,适用于任何其他不纯粹与透明度有关的图像差异。
原始答案
比对后可以得到图像属性,在里面找到叫做“失真”的元素。所以,如果我从这张图片开始:
然后将它向右滚动 10 个像素:
<?php
$image1 = new Imagick("image.png");
$image2 = new Imagick("image.png");
$result = $image1->compareImages($image2,Imagick::METRIC_MEANABSOLUTEERROR);
$p1=$image1->getImageProperties();
print_r($p1);
$image1->rollImage(10,0);
$result = $image1->compareImages($image2,Imagick::METRIC_MEANABSOLUTEERROR);
$p1=$image1->getImageProperties();
print_r($p1);
?>
输出
Array
(
[date:create] => 2016-06-02T14:15:01+01:00
[date:modify] => 2016-06-02T14:15:01+01:00
[distortion] => 0 <--- Here's the little devil
[png:bKGD] => chunk was found (see Background color, above)
[png:cHRM] => chunk was found (see Chromaticity, above)
[png:gAMA] => gamma=0.45454544 (See Gamma, above)
[png:IHDR.bit-depth-orig] => 4
[png:IHDR.bit_depth] => 4
[png:IHDR.color-type-orig] => 3
[png:IHDR.color_type] => 3 (Indexed)
[png:IHDR.interlace_method] => 0 (Not interlaced)
[png:IHDR.width,height] => 200, 200
[png:PLTE.number_colors] => 5
[png:sRGB] => intent=0 (Perceptual Intent)
[png:text] => 2 tEXt/zTXt/iTXt chunks were found
[png:tIME] => 2016-06-02T14:15:01Z
)
Array
(
[date:create] => 2016-06-02T14:15:01+01:00
[date:modify] => 2016-06-02T14:15:01+01:00
[distortion] => 0.0833333 <--- Here's the little devil
[png:bKGD] => chunk was found (see Background color, above)
[png:cHRM] => chunk was found (see Chromaticity, above)
[png:gAMA] => gamma=0.45454544 (See Gamma, above)
[png:IHDR.bit-depth-orig] => 4
[png:IHDR.bit_depth] => 4
[png:IHDR.color-type-orig] => 3
[png:IHDR.color_type] => 3 (Indexed)
[png:IHDR.interlace_method] => 0 (Not interlaced)
[png:IHDR.width,height] => 200, 200
[png:PLTE.number_colors] => 5
[png:sRGB] => intent=0 (Perceptual Intent)
[png:text] => 2 tEXt/zTXt/iTXt chunks were found
[png:tIME] => 2016-06-02T14:15:01Z
)
关于php - PHP 图像中已更改像素的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37581147/
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
我有一个rubyonrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功