Frage

Ich habe ein bisschen ein Problem meine Bilder auf eine richtig vordefinierte Größe skaliert werden. Ich habe mich gefragt - da es sich um reine Mathematik, wenn es irgendeine Art von gemeinsamen logischen Algorithmus ist, die in jeder Sprache funktioniert (PHP, Actionscript, Javascript etc.) Bilder proportional skaliert

.

Ich verwende diese im Moment:

var maxHeight   = 300;
var maxWidth    = 300;

var ratio:Number    =   height / width;

if (height > maxHeight) {
    height = maxHeight;
    width = Math.round(height / ratio);
} 

else if(width > maxWidth) {
    width = maxWidth;
    height = Math.round(width * ratio);
}

Aber es funktioniert nicht richtig. Die Bilder skaliert proportional, sicher genug, aber die Größe ist nicht bei 300 (entweder in der Breite oder Höhe) eingestellt. Es Art Sinn macht, aber ich frage mich, ob es eine todsichere ist, einfache Möglichkeit, Bilder proportional skaliert wird.

War es hilfreich?

Lösung

ratio = MIN( maxWidth / width, maxHeight/ height );
width = ratio * width;
height = ratio * height;

Stellen Sie sicher, dass alle Gräben sind Gleitkommazahlen.

Andere Tipps

Dark Shikari hat. Ihre Lösung wie in der Frage angegeben schlägt fehl, weil Sie nicht erste Festlegung, welche dimenson Größe zu maxsize Verhältnis größer und und Reduzierung beiden Dimensionen von diesem größeren Verhältnis.

Ihre aktuelle Lösung ist die Verwendung einer seriellen, bedingten Analyse einer potentiellen dimensionaler Verletzung und dann arbeiten die andere nicht.

Beachten Sie auch, dass, wenn Sie möchten, gehobenen Bilder, Ihre aktuelle Lösung nicht fliegen, und dunkle Shikari ist wieder werden.

Ich würde empfehlen, schreiben diesen Code nicht selbst; es gibt Myriaden von Pixelebene Details, die eine schwere Zeit in Anspruch nehmen richtig zu machen. Verwenden Sie ImageMagick, es ist die beste Grafik-Bibliothek gibt.

Hier ist, wie ich es tun:

+ (NSSize) scaleHeight:(NSSize)origSize 
             newHeight:(CGFloat)height {

    NSSize newSize = NSZeroSize;
    if ( origSize.height == 0 ) return newSize;

    newSize.height = height;
    CGFloat factor = ( height / origSize.height );
    newSize.width  = (origSize.width * factor );

    return newSize;
}

+ (NSSize) scaleWidth:(NSSize)origSize 
             newWidth:(CGFloat)width {

    NSSize newSize = NSZeroSize;
    if ( origSize.width == 0 ) return newSize;

    newSize.width  = width;
    CGFloat factor = ( width / origSize.width );
    newSize.height = (origSize.height * factor );

    return newSize;
}

Hier ist eine Funktion, die ich für meine Website entwickelt haben, möchten Sie vielleicht verwenden. Es basiert auf der Antwort oben.

Es tut andere Dinge, nicht nur die Bildverarbeitung -. Sie alles entfernen, die nicht notwendig ist,

<?php

$thumb_width    = 500;
$thumb_height   = 500;

if ($handle = opendir('to-do')) {
    echo "Directory handle: $handle<br />";
    echo "Files:<br /><br />";

    /* This is the correct way to loop over the directory. */
    while (false !== ($file = readdir($handle))) {

        if ( ($file != ".") && ($file != "..") ){
            echo "$file";

            $original_path = "to-do/" . $file;

            $source_image = ImageCreateFromJPEG( $original_path );
            $thumb_width = $thumb_width;
            $thumb_height = $thumb_height;

            // Create the image, of the required size
            $thumbnail = imagecreatetruecolor($thumb_width, $thumb_height);
            if($thumbnail === false) {
                //creation failed -- probably not enough memory
                return null;
            }

            // Fill the image with a white color (this will be visible in the padding around the image,
            // if the aspect ratios of the image and the thumbnail do not match)
            // Replace this with any color you want, or comment it out for black.
            // I used grey for testing =)
            $fill = imagecolorallocate($thumbnail, 255, 255, 255);
            imagefill($thumbnail, 0, 0, $fill);

            // Compute resize ratio
            $hratio = $thumb_height / imagesy($source_image);
            $wratio = $thumb_width / imagesx($source_image);
            $ratio = min($hratio, $wratio);

            // If the source is smaller than the thumbnail size, 
            // Don't resize -- add a margin instead
            // (that is, dont magnify images)
            if ($ratio > 1.0)
                $ratio = 1.0;

            // Compute sizes
            $sy = floor(imagesy($source_image) * $ratio);
            $sx = floor(imagesx($source_image) * $ratio);

            // Compute margins
            // Using these margins centers the image in the thumbnail.
            // If you always want the image to the top left, set both of these to 0
            $m_y = floor(($thumb_height - $sy) / 2);
            $m_x = floor(($thumb_width - $sx) / 2);

            // Copy the image data, and resample
            // If you want a fast and ugly thumbnail, replace imagecopyresampled with imagecopyresized
            if (!imagecopyresampled($thumbnail, $source_image,
                $m_x, $m_y, //dest x, y (margins)
                0, 0, //src x, y (0,0 means top left)
                $sx, $sy,//dest w, h (resample to this size (computed above)
                imagesx($source_image), imagesy($source_image)) //src w, h (the full size of the original)
            ) {
                //copy failed
                imagedestroy($thumbnail);
                return null;
            }

            /* Set the new file name */
            $thumbnail_file_name = $file;

            /* Apply changes on the original image and write the result on the disk */
            ImageJPEG( $thumbnail, $complete_path . "done/" . $thumbnail_file_name );
            unset($source_image);
            unset($thumbnail);
            unset($original_path);
            unset($targeted_image_size);

            echo " done<br />";

        }

    }

    closedir($handle);
}

?>

I auch diese Funktion gemacht proportional zu skalieren, verwendet es eine vorgegebene Breite, Höhe und gegebenenfalls die maximale Breite / Höhe wünscht u (abhängig von der gegebenen Breite und Höhe)

   function scaleProportional($img_w,$img_h,$max=50)
   {
       $w = 0;
       $h = 0;

       $img_w > $img_h ? $w = $img_w / $img_h : $w = 1;
       $img_h > $img_w ? $h = $img_h / $img_w : $h = 1;

       $ws = $w > $h ? $ws = ($w / $w) * $max : $ws = (1 / $h) * $max;
       $hs = $h > $w ? $hs = ($h / $h) * $max : $hs = (1 / $w) * $max;

       return array(
           'width'=>$ws,
           'height'=>$hs
       );
   }

Nutzung:

            $getScale = scaleProportional(600,200,500);
            $targ_w = $getScale['width']; //returns 500
            $targ_h = $getScale['height']; //returns 16,6666667
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top