Как определить, имеет ли изображение прозрачный пиксель

Я только что нашел фрагмент кода, который использовался для определения наличия прозрачных пикселей на изображении:

my $alpha  = $gd->transparent;
if ($alpha < 0) {
    die("The image you uploaded has no transparent pixels. (alpha = $alpha)");
}

Очевидно, это не работает. Я попробовал это с изображением user-desktop.png из открытой библиотеки значков с прозрачными пикселями. Чек вернул -1.

Я могу только догадываться, почему эта команда была использована. Руководство GD гласит:

Если вы вызываете этот метод [прозрачный] без каких-либо параметров, он вернет текущий индекс прозрачного цвета или -1, если его нет.

Итак, в качестве побочного вопроса: прозрачные пиксели могут вообще не иметь цветового индекса - верно?

Потом я нашел в потоке Perl GD проверку, прозрачен ли пиксель. Но для этого решения я должен перебрать все пиксели изображения (по крайней мере, в случае сусла, когда единственным прозрачным пикселем будет последний).

Нет ли простого способа проверить эту информацию? Может быть, такой метод, как $ image_object-> has_transparent_pixels?

NB: я не привязан к GD, поэтому другие модули Image могут также работать (однако, я на Windows - он должен работать там).

1 ответ

Обновленный ответ

Как отмечает @ikegami (спасибо), GIF-файлы имеют в своей палитре обозначенный прозрачный "цветной" пиксель, а не слой альфа / прозрачности, в котором каждый пиксель имеет свое значение прозрачности, обычно между 0-255.

Я сгенерировал GIF размером 2x2 пикселя с одним прозрачным пикселем, одним красным, одним зеленым и одним синим, а затем запустил ImageMagick's identify Команда против него и получила следующее. Я пометил прозрачные части пикселя стрелкой.

Image: a.gif
  Format: GIF (CompuServe graphics interchange format)
  Mime type: image/gif
  Class: PseudoClass
  Geometry: 4x4+0+0
  Units: Undefined
  Type: PaletteAlpha
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8/1-bit
  Channel depth:
    red: 1-bit
    green: 1-bit
    blue: 1-bit
    alpha: 1-bit
  Channel statistics:
    Pixels: 16
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 127.5 (0.5)
      standard deviation: 127.5 (0.5)
      kurtosis: -2
      skewness: 0
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 127.5 (0.5)
      standard deviation: 127.5 (0.5)
      kurtosis: -2
      skewness: 0
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 127.5 (0.5)
      standard deviation: 127.5 (0.5)
      kurtosis: -2
      skewness: 0
    Alpha:
      min: 0 (0)
      max: 255 (1)
      mean: 191.25 (0.75)
      standard deviation: 110.418 (0.433013)
      kurtosis: -0.666667
      skewness: 1.1547
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 111.562 (0.4375)
      standard deviation: 123.451 (0.484123)
      kurtosis: -1.8275
      skewness: 0.271109
  Alpha: srgba(255,255,255,0)   #FFFFFF00
  Colors: 4
  Histogram:
         4: (  0,  0,255,255) #0000FF blue
         4: (  0,255,  0,255) #00FF00 lime
         4: (255,  0,  0,255) #FF0000 red
         4: (255,255,255,  0) #FFFFFF00 srgba(255,255,255,0)
  Colormap entries: 4
  Colormap:
         0: (255,  0,  0,255) #FF0000 red
         1: (  0,255,  0,255) #00FF00 lime
         2: (  0,  0,255,255) #0000FF blue
         3: (255,255,255,  0) #FFFFFF00 srgba(255,255,255,0)      <---------
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: srgba(255,255,255,0)
  Border color: srgba(223,223,223,1)
  Matte color: grey74
  Transparent color: srgba(255,255,255,0)    <---------------
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 4x4+0+0
  Dispose: Undefined
  Compression: LZW
  Orientation: Undefined
  Properties:
    date:create: 2014-10-11T10:40:09+01:00
    date:modify: 2014-10-11T10:40:08+01:00
    signature: 1c82b4c2e772fb075994516cc5661e9dec35b8142f89c651253d07fc3c4642bb
  Profiles:
    Profile-gif:xmp dataxmp: 1031 bytes
  Artifacts:
    filename: a.gif
    verbose: true
  Tainted: False
  Filesize: 1.11KB
  Number pixels: 16
  Pixels per second: 16PB
  User time: 0.000u
  Elapsed time: 0:01.000
  Version: ImageMagick 6.8.9-7 Q16 x86_64 2014-09-10 http://www.imagemagick.org

Итак, IM знает о прозрачном пикселе GIF - я еще покопаюсь и посмотрю, можно ли найти его разумно в Perl - сейчас вы можете просто запустить следующее в галочках Perl.

my $output = `identify -verbose a.gif | grep -i transparent`;   # or maybe with FINDSTR on Windows

Как альтернатива, и менее проблематично для разных платформ, %A escape говорит вам, если у изображения включена прозрачность:

convert a.gif -print "%A" null:
True

convert a.jpg -print "%A" null:
False

Или, более Perl-й способ:

#!/usr/bin/perl
use warnings;
use strict;
use Image::Magick;
my $image = Image::Magick->new();
$image->Read($ARGV[0]);
my $a = $image->Get('%A');
print $a;

perl ./script.pl a.gif
True

perl ./script.pl a.jpg
False

Оригинальный ответ

Я думаю, что вы можете быть немного смущены прозрачностью. Изображения либо имеют прозрачность, то есть целый слой, либо нет. В общем, речь не идет о прозрачности или отсутствии одного пикселя. С самого начала, JPEGне поддерживают прозрачность, GIF а также PNG может поддерживать прозрачность, но они не всегда прозрачны.

Итак, если у вас есть PNG или GIF, это может иметь прозрачный слой. Если это так, каждый пиксель может быть либо полностью прозрачным, либо полностью непрозрачным, либо где-то посередине. Если вы используете ImageMagick, он доступен в командной строке или с помощью PHP, Perl и других привязок.

Используя командную строку, вы можете определить, имеет ли изображение слой прозрачности, с помощью этой команды:

convert InputImage.png -format "%[opaque]" info:

и он либо вернется true или же false,

В Perl вы можете сделать это:

#!/usr/bin/perl
use warnings;
use strict;
use Image::Magick;
my $image = Image::Magick->new();
$image->Read($ARGV[0]);
my $a = $image->Get('%[opaque]');
print $a;

затем запустите как:

perl ./script.pl ImageName.png
Другие вопросы по тегам