mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-11 06:01:25 +02:00
85 lines
2.3 KiB
ObjectPascal
85 lines
2.3 KiB
ObjectPascal
{
|
|
Demonstration program for the ImageMagick Library
|
|
|
|
Usage: Just execute the program. It will change all black pixels
|
|
in the image.png image on it's directory to be transparent
|
|
and then it will save it as image2.png
|
|
The idea is to demonstrate pixel access using MagickWand.
|
|
}
|
|
program wandpixelaccess;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
uses SysUtils, magick_wand, ImageMagick, ctypes;
|
|
|
|
procedure ThrowWandException(wand: PMagickWand);
|
|
var
|
|
description: PChar;
|
|
severity: ExceptionType;
|
|
begin
|
|
description := MagickGetException(wand, @severity);
|
|
WriteLn(Format('An error ocurred. Description: %s', [description]));
|
|
description := MagickRelinquishMemory(description);
|
|
Abort;
|
|
end;
|
|
|
|
var
|
|
status: MagickBooleanType;
|
|
wand: PMagickWand = nil;
|
|
pixel: MagickPixelPacket;
|
|
iterator: PPixelIterator;
|
|
pixels: PPPixelWand = nil;
|
|
x, y: Integer;
|
|
width: culong;
|
|
begin
|
|
{ Read an image. }
|
|
|
|
MagickWandGenesis;
|
|
|
|
wand := NewMagickWand();
|
|
|
|
try
|
|
status := MagickReadImage(wand, 'image.png');
|
|
if (status = MagickFalse) then ThrowWandException(wand);
|
|
|
|
iterator := NewPixelIterator(wand);
|
|
if (iterator = nil) then ThrowWandException(wand);
|
|
|
|
for y := 0 to MagickGetImageHeight(wand) - 1 do
|
|
begin
|
|
// WriteLn(' Line ', y, ' from ', MagickGetImageHeight(wand) - 1);
|
|
pixels := PixelGetNextIteratorRow(iterator, width);
|
|
if (pixels = nil) then Break;
|
|
|
|
for x := 0 to width - 1 do
|
|
begin
|
|
// WriteLn(Format(' x %d y %d r %f g %f b %f o %f',
|
|
// [x, y, pixel.red, pixel.green, pixel.blue, pixel.opacity]));
|
|
PixelGetMagickColor(pixels[x], @pixel);
|
|
if (pixel.red = 0.0) and
|
|
(pixel.green = 0.0) and
|
|
(pixel.blue = 0.0) then
|
|
begin
|
|
pixel.opacity := QuantumRange;
|
|
pixel.matte := QuantumRange; // matte=alpha
|
|
end;
|
|
PixelSetMagickColor(pixels[x], @pixel);
|
|
end;
|
|
PixelSyncIterator(iterator);
|
|
end;
|
|
|
|
// if y < MagickGetImageHeight(wand) then ThrowWandException(wand);
|
|
iterator := DestroyPixelIterator(iterator);
|
|
|
|
{ Write the image }
|
|
|
|
status := MagickWriteImage(wand, 'image2.png');
|
|
if (status = MagickFalse) then ThrowWandException(wand);
|
|
finally
|
|
{ Clean-up }
|
|
if wand <> nil then wand := DestroyMagickWand(wand);
|
|
MagickWandTerminus;
|
|
end;
|
|
end.
|
|
|