0

我想使用 Cairo Graphics 在 pdf 文档中包含内存中的图像(运输标签)。
为了减少对输入特征的依赖,我决定使用 perlMagick 检测和设置图像属性。

我设法根据需要定位和缩放所有元素,但包含的图像是一个乱码像素的矩形

我假设我需要设置或更改一个附加属性,但我不知道是什么。

这是我的代码:

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, 0);
    $cr->paint();
    $cr->restore();
}

源图像是有效的(我在我的项目中建立了一个下载选项)。
在我从中获取标签的外部源中,我可以选择具有各种 dpi 的 gif、jpg 和 zpl。

在(跳过ImageMagick)中使用$sourceImage(jpg)create_for_data给了我类似的结果(不同模式的乱码像素)。

更新

在某处读到它可能来自标题后,我尝试使用depth和灰度,如问题how-do-i-write-a-perl-script-to-use-curl-to-process-a-url using the谷歌的标志:

...
$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,0,1,0, 0,1,0,0, 1,0,0,0, 0,0,0,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, $labelSize[0], $labelSize[1], $stride);


    my $scaleFactor = $paperSizeRef->[0]/ $labelSize[0] / 2;
    $cr->scale($scaleFactor, $scaleFactor);

    $cr->set_source_surface($labelSurface, 0, 0);
    $cr->paint();
}

虽然我使用的是 RGB,但似乎有一个偏移,在光学上将所有后续行移动了一点: Google image was skewed

更新

我没有让这个工作:图像一直被歪曲。我决定采取不同的路线:使用wkhtmltopdf

4

0 回答 0