如何解决如何通过 Image Magick 在 Cairo Graphics 中包含图像?
我想使用 Cairo Graphics 在 pdf 文档中包含内存中的图像(发货标签)。
为了减少对输入特征的依赖,我决定使用 perlMagick 检测和设置图像属性。
我设法根据需要定位和缩放所有元素,但包含的图像是 rectangle of garbled pixels。
我假设我需要设置或更改其他属性,但我不知道是什么。
这是我的代码:
use Cairo;
...
sub _drawLabel {
require Image::Magick;
my $self = shift;
my %args = @_;
my $cr = $args{'cr'} || die 'Missing parameter "cr" (Cairo context)'; # Cairo context
my $paperSizeRef = $args{'paperSize'} || die 'Missing parameter "paperSize"'; # [width,height]
my $sourceImage = $args{'image'} || die 'Missing parameter "image"';
my $img = Image::Magick->new();
$img->BlobToImage($sourceImage);
my $convertedImage = $img->ImagetoBlob('magick' => 'png24');
$img->Get('bounding-Box') =~ /^(\d+)x(\d+)/;
my @labelSize = ($1,$2);
my $labelCairoFormat = 'rgb24';
my $stride = Cairo::Format::stride_for_width($labelCairoFormat,$labelSize[0]);
my $labelSurface = Cairo::ImageSurface->create_for_data( $convertedImage,$labelCairoFormat,$labelSize[0],$labelSize[1],$stride);
$cr->save();
$cr->translate(10,$paperSizeRef->[1] - 10);
$cr->rotate(-0.5 * pi()); # radials; -0.5 is 90 degrees clockwise
my $scaleFactor = $paperSizeRef->[0] / $labelSize[0] / 2;
$cr->scale($scaleFactor,$scaleFactor);
$cr->set_source_surface($labelSurface,0);
$cr->paint();
$cr->restore();
}
源图像有效(我在我的项目中构建了一个下载选项)。
在我从中获取标签的外部源中,我可以选择具有各种 dpi 的 gif、jpg 和 zpl。
在 $sourceImage
中使用 create_for_data
(jpg)(跳过 ImageMagick)给了我类似的结果(不同模式的乱码像素)。
更新
在某处读到它可能来自标题后,我尝试使用 depth
和灰度,如问题 how-do-i-write-a-perl-script-to-use-curl-to-process-a-url 中建议的那样使用 Google 的标志:
...
$sourceImage = `curl http://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png`;
...
my $convertedImage = $img->ImagetoBlob('magick' => 'GRAY','depth' => 8);
...
my $labelCairoFormat = 'a8';
...
这适用于 Google 的 png :) 可惜我的jpg还是乱码。
更新
我确实得到了正确的颜色,但图像仍然混乱(歪斜):
sub _drawLabel {
require Image::Magick;
my $self = shift;
my %args = @_;
my $cr = $args{'cr'} || die 'Missing parameter "cr" (Cairo context)'; # Cairo context
my $paperSizeRef = $args{'paperSize'} || die 'Missing parameter "paperSize"'; # [width,height]
my $sourceImage = `curl http://www.google.com/images/branding/googlelog/2x/googlelogo_color_92x30dp.png`;
my $img = Image::Magick->new();
$img->BlobToImage($sourceImage);
$img->Get('bounding-Box') =~ /^(\d+)x(\d+)/;
my @labelSize = ($1,$2);
$img->ColorMatrix('matrix' => [0,1,1]); # Fixing RGBA to ARGB32
my $convertedImage = $img->ImagetoBlob('magick' => 'RGBA');
my $cairoFormat = 'argb32';
my $stride = Cairo::Format::stride_for_width($cairoFormat,$labelSize[0]);
my $labelSurface = Cairo::ImageSurface->create_for_data($convertedImage,$cairoFormat,$stride);
my $scaleFactor = $paperSizeRef->[0]/ $labelSize[0] / 2;
$cr->scale($scaleFactor,0);
$cr->paint();
}
虽然我使用的是 RGB,但似乎有一个偏移量,在光学上将所有后续行移动了一点: screenshot of Google image being skewed
更新
我没有让它起作用:图像一直倾斜。 我决定采取不同的路线:使用 wkhtmltopdf
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。