Heim  >  Artikel  >  Web-Frontend  >  Einfacher Beispielcode zum Zuschneiden und Speichern von Bildern mit Javascript

Einfacher Beispielcode zum Zuschneiden und Speichern von Bildern mit Javascript

黄舟
黄舟Original
2017-03-20 15:00:111469Durchsuche

Das Zuschneiden von Bildern ist uns in letzter Zeit sehr vertraut. Ich bin bei der Arbeit wieder auf dieses Bedürfnis gestoßen, also dachte ich, ich würde es einfach in Ordnung bringen. Die Methode kann bei Bedarf von jedem und mir selbst nachgelesen werden, daher stellt dieser Artikel sie hauptsächlich vor. Um eine einfache Implementierung mit Javascript zum Zuschneiden und Speichern von Bildern zu erreichen, verwende ich das THINKPHP-Framework für die Back-End-PHP-Verarbeitung. Freunde in Not können darauf zurückgreifen.

Vorwort

Meiner Meinung nach gibt es nicht viele Teile der Seite, die flexibler in der Gestaltung sind, wie zum Beispiel das Schieben Bestätigungscodes und Bildzuschnitt. Warten auf ein besseres Interaktionsdesign.

Als ich anfing zu arbeiten, wollte ich diese Dinge verstehen, aber ich hatte nie das Bedürfnis, meine freie Zeit zu nutzen und sie den ganzen Nachmittag lang zu studieren , und ich habe mich darauf vorbereitet, gefoltert zu werden. Mein

ist immer noch relativ schwach.

Erzielen Sie den Effekt:

Nachdem der Benutzer zum Hochladen des Bildes geklickt hat, werden auf der Seite das hochgeladene Bild sowie ein Zuschneidefeld und zwei angezeigt Vorschaubereiche werden angezeigt. Klicken Sie abschließend auf die Schaltfläche „Zuschneiden“, um das zugeschnittene Bild auf dem Server zu speichern.

Der Effekt ist sehr einfach. Es gibt zwei Schwierigkeiten, auf die ich im gesamten Prozess gestoßen bin. Der erste ist der JS-Effekt des Zuschneidens und der zweite ist die Verarbeitung von Bilddaten.

Für die erste Frage habe ich ein Plug-in im Internet zitiert. Die Benutzerzufriedenheit mit dem Zuschneidevorgang kann meines Erachtens nur als durchschnittlich angesehen werden, da dies nur der Fall ist Obwohl es acht Zieheinstellungen am Rand gibt, skaliert der Rahmen beim Ziehen des Rahmens immer noch entsprechend dem Quadrat, was für mich nicht sehr zufriedenstellend ist.

Die Implementierungsmethode ist wie folgt:

Das Folgende ist ein einfaches Seitendesign:

<p style="float:left;"><img id="target"></p>
<p style="width:48px;height:48px;margin:10px;overflow:hidden; float:left;"><img style="float:left;" id="preview" ></p>
<p style="width:190px;height:195px;margin:10px;overflow:hidden; float:left;"><img style="float:left;" id="preview2" ></p>
<form action="{:U(&#39;/test/crop_deal&#39;)}" method="post" onsubmit="return checkCoords()" enctype="multipart/form-data" id="form">
<input type="file" name="file" onchange="change_image(this)">
<input type="hidden" id="x" name="x" />
<input type="hidden" id="y" name="y" />
<input type="hidden" id="w" name="w" />
<input type="hidden" id="h" name="h" />
<input type="submit" value="裁剪"/>
</form>

Das Folgende ist der JS-Code:

function change_image(file){
var reader = new FileReader();
reader.onload = function(evt){
$("#target").attr(&#39;src&#39;,evt.target.result);
$(&#39;#preview&#39;).attr(&#39;src&#39;,evt.target.result);
$(&#39;#preview2&#39;).attr(&#39;src&#39;,evt.target.result);
// $(&#39;#target&#39;).css({"height":"600px","width":"600px"});
// 限制了大小会影响到截图的效果
};
reader.readAsDataURL(file.files[0]);

var jcrop_api, boundx, boundy;

setTimeout(function(){


$(&#39;#target&#39;).Jcrop({
minSize: [48,48],
setSelect: [0,0,190,190],
onChange: updatePreview,
onSelect: updatePreview,
onSelect: updateCoords,
aspectRatio: 1
},
function(){
// Use the API to get the real image size
var bounds = this.getBounds();
boundx = bounds[0];
boundy = bounds[1];
// Store the API in the jcrop_api variable
jcrop_api = this;
});

function updatePreview(c){
if (parseInt(c.w) > 0)
{
var rx = 48 / c.w; //小头像预览p的大小
var ry = 48 / c.h;

$(&#39;#preview&#39;).css({
width: Math.round(rx * boundx) + &#39;px&#39;,
height: Math.round(ry * boundy) + &#39;px&#39;,
marginLeft: &#39;-&#39; + Math.round(rx * c.x) + &#39;px&#39;,
marginTop: &#39;-&#39; + Math.round(ry * c.y) + &#39;px&#39;
});
}
{
var rx = 199 / c.w; //大头像预览p的大小
var ry = 199 / c.h;
$(&#39;#preview2&#39;).css({
width: Math.round(rx * boundx) + &#39;px&#39;,
height: Math.round(ry * boundy) + &#39;px&#39;,
marginLeft: &#39;-&#39; + Math.round(rx * c.x) + &#39;px&#39;,
marginTop: &#39;-&#39; + Math.round(ry * c.y) + &#39;px&#39;
});
}
};


function updateCoords(c)
{
$(&#39;#x&#39;).val(c.x);
$(&#39;#y&#39;).val(c.y);
$(&#39;#w&#39;).val(c.w);
$(&#39;#h&#39;).val(c.h);
};

},500);

}

Hier sind zwei Erinnerungen:

Eins : Vergessen Sie nicht, am Kopf der Seite ein Plug-in einzuführen:

  <script src="/plug/js/jquery.min.js" type="text/javascript"></script>
  <script src="/plug/js/jquery.Jcrop.min.js" type="text/javascript"></script>
  <link rel="stylesheet" href="/plug/css/Jcrop.css" rel="external nofollow" type="text/css" />

Zweitens: Einige Leute mit scharfen Augen haben möglicherweise ein Timing in JS gesehen und sind gleichzeitig verwirrt. Ist das nicht etwas unnötig? Eigentlich nein, es dauert einige Zeit, das Bild auf JS hochzuladen und auf die Seite zu laden. Die Bedeutung dieses Timings besteht darin, zu warten, bis das Bild auf der Seite geladen wird, bevor der Zuschneideeffekt geladen wird. Dies wird auch nach wiederholten Experimenten erreicht Praktiken.

Ich verwende das THINKPHP-Framework für die Back-End-PHP-Verarbeitung. Die Version ist 3.1.3

Fügen Sie den Code ein:

Hier ist der Aufruf Es gibt eine Reihe von Methoden zum Erstellen von Bildern in der GD-Bibliothek. Die wichtigste ist
function crop_deal(){
  ob_clean();
  import ( &#39;ORG.Net.UploadFile&#39; );
  $upload = new UploadFile ();
  $upload->maxSize = 2000000;
  $upload->allowExts = array (
    &#39;jpg&#39;,
    &#39;gif&#39;,
    &#39;png&#39;,
    &#39;jpeg&#39;
  );
  $upload->savePath = &#39;./upload/test/&#39;;
  $upload->autoSub = true;
  $upload->subType = &#39;date&#39;;
  $upload->dateFormat = &#39;Ymd&#39;;
  if ($upload->upload () ) {
    $info = $upload->getUploadFileInfo();
    $new_path = "./upload/test/thumb".date(&#39;Ymd&#39;);
    $file_store = $new_path."/".date(&#39;YmdHis&#39;).".jpg";
    if(!file_exists($new_path)){
      mkdir($new_path,0777,true);
    }
    $source_path = "http://".$_SERVER[&#39;HTTP_HOST&#39;]."/upload/test/".$info[0][&#39;savename&#39;];
    $img_size = getimagesize($source_path);
    $width = $img_size[0];
    $height = $img_size[1];  
    $mime = $img_size[&#39;mime&#39;];
    $srcImg = imagecreatefromstring(file_get_contents($source_path));
    $cropped_img = imagecreatetruecolor($_POST[&#39;w&#39;], $_POST[&#39;h&#39;]);
    //缩放
    // imagecopyresampled($cropped_img,$srcImg,0,0,$_POST[&#39;x&#39;],$_POST[&#39;y&#39;],$_POST[&#39;w&#39;],$_POST[&#39;h&#39;],$width,$height);
    //裁剪
    imagecopy($cropped_img,$srcImg,0,0,$_POST[&#39;x&#39;],$_POST[&#39;y&#39;],$_POST[&#39;w&#39;],$_POST[&#39;h&#39;]);
    header("Content-Type:image/jpeg");
    imagejpeg($cropped_img,$file_store);
    imagedestroy($srcImg);
    imagedestroy($cropped_img);
  }

}
, die das Originalbild entsprechend der angegebenen Zuschneideposition und Zuschneidegröße kopiert . Der Seitenbenutzer schneidet das Bild zu. Tatsächlich bearbeitet das Frontend das Bild nicht, sondern erhält beim Zuschneiden die Koordinatenposition und die Zuschneidegröße und übermittelt es dann zur Bearbeitung an PHP! !

imagecopy()

Zusammenfassung

Das obige ist der detaillierte Inhalt vonEinfacher Beispielcode zum Zuschneiden und Speichern von Bildern mit Javascript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn