微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过 Image Magick 在 Cairo Graphics 中包含图像?

如何解决如何通过 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 举报,一经查实,本站将立刻删除。