Anthony Thyssen wrote:
Stas Bekman on  wrote...
| Anthony Thyssen wrote:
| > Stas Bekman on  wrote...
| > | Hi,
| > |
| > | ImageMagick used to make a smooth image rotation before. Now I've
| > | upgraded to the latest version 6.3.7 (same issue with 6.3.2), and now
| > | the rotation leaves a jiggy outline
| > |
| > | Here is the input file:
| > |
| > | in.jpg
| > | http://img2.freeimagehosting.net/image.php?b7174eb966.jpg
| > |
| > | I run:
| > | convert -rotate 5 -background "transparent" in.jpg out.jpg
| > |
| > | here is the output:
| > | http://img2.freeimagehosting.net/image.php?007de57566.jpg
| > |
| > | can you see the border being all messed up now?
| > |
| > Try ordering the arguments right...
| > Also make sure the image has a alpha channel
| >
| >    convert in.jpg -matte -background "transparent" -rotate 5 out.jpg
| >
| > | I need to use transparent background since the image is going to be
| > | composited on top of other images.
| > |
| > | Is there some extra argument that I need to add now? (which I'd imagine
| > | used to be added by default in the past, but it's no longer the case)
| > |
| > See IM examples, Image rotation.
| >   http://imagemagick.org/Usage/distorts/#rotate
|
| I tried all the examples, Anthony. It's not working. It used to work
| just fine before. I haven't touched my code, it just broke after the
| upgrade to the latest IM :(
|
| I even tried:
|
| convert in.jpg -interpolate mesh -filter point -matte -background
| "transparent" -virtual-pixel transparent +distort SRT 5 out.jpg
|
Sorry.  (Smack hand onto forehead)....

You saved the image into JPEG!!!!!
Jpeg can not handle a transparent color!!!!!!

Save it to PNG (still include the -matte operator) and all should be
well.

   convert in.jpg -matte -background "transparent" -rotate 5 out.png

If you need it as JPEG, you will have to flatten it onto a
appropriate colored background, before hand.

  convert in.jpg -matte -background none -rotate 5 \
          -background gray -flatten out.jpg

Or 'underlaying' a checkerboard background...

  convert in.jpg -matte -background none -rotate 5 \
          -size 300x300 pattern:checkerboard -compose dstover -flatten \
          out.jpg

PS:  the color 'none' is the same as 'transparent'

Thank you very much, Anthony.

The key was -flatten. It used to work before with jpeg output w/o flatten. Now I added:

$background->Set(background   => "black");
$background = $background->Flatten();

and it's smooth border after rotation again!!! Yeah!

$background is the image on which I composite a bunch of icons in rotated form, which results in stacks as following:
http://stason.org/photos/gallery/place/index.html

Here is the function I use to create this kind of stacked images (in perl)

sub make_img_stack_flat {
    my ($imgs, $output) = @_;

    my @imgs = @$imgs;

    my $background = Image::Magick->new;

    my $tw = 164;    # thumb width
    my $th = 285;    # sheared thumb hight
    my $w  = 800;    # stack image width
    my $h  = $th+28; # stack image height
    my $nw = $w - $tw;

    my $rc;

    $background->Set(size => "${w}x$h");
    $rc = $background->Read("xc:#00000000'");
    $background->Set(background   => "black");
    #warn "$rc" unless ref $rc;

    # use at most 25 images
    my $total = scalar @imgs;
    my $max = 25;
    $max = $total if $max > $total;
    my @rand = map { splice @imgs, int(rand $#imgs), 1 } 1..$max;
    # reverse, since otherwise the last image always ends up first if
    # there is less images than $max
    @imgs = reverse @rand;

    my $quotient = @imgs;
    my $unit = int ($nw / $quotient);

    #warn "quotient = $quotient, unit = $unit\n";

    #my $c = 2.6 + scalar @imgs;
    my $gap = $unit;
    my $c = 0;

    my @x = map { $nw - $unit*$_ } (1..$quotient);
    @x = map { splice @x, int(rand $#x), 1 } 1..$quotient;

    if ($quotient == 1) {
        @x = $nw - 140 - rand(1)*$nw/2;
    }

    for my $file (@imgs) {
        $c++;
        $gap += $unit;

        my $img = Image::Magick->new();
        $img->Read($file);

        # the bigger the number the closer the images are
        my $x = pop @x;
        my $y = 14 + rand(1)*70;

        $x = 14 if $x < 14; # don't run away

        #warn "$gap $x $y $file\n";

        # do something to the image
        my $err = $img->Rotate(
            degrees => 90*rand(1)-45,
            background   => "transparent",
        );
        die $err if $err;

        $img->Set(matte=>"true");
        $img->Set(background   => "transparent");
        $img->Set(interlace   => "PNG");

        my ($iw, $ih) = $img->Get('width', 'height');
        #warn "orig: $iw $ih $file\n";

# stopped working in imagemagick 6.3.2.x, but now seems to work
# without the 'compose' argument
#                               compose  => 'atop',

        my $err = $background->Composite(image    => $img,
                               x => $x,
                               y => $y,
        );
        die $err if $err;
    }

    $background = $background->Flatten();
    $background->Set(quality=>75);
    $background->Write($output);

}
--
_____________________________________________________________
Stas Bekman    mailto:[EMAIL PROTECTED] http://stasosphere.com/
http://www.linkedin.com/in/stasbekman http://stason.org/
http://stason.org/photos/gallery/     http://healingcloud.com
http://chestofbooks.com/              http://modperlbook.org/
                                      http://modperl2book.org

_______________________________________________
Magick-users mailing list
[email protected]
http://studio.imagemagick.org/mailman/listinfo/magick-users

Reply via email to