问题描述
我想使用 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 (将#修改为@)