我想使用 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