私は現在、web-to-print、ポスター印刷アプリケーションのソリューションを開発しています。
私が含めたい機能の1つは、特定の画像のポスターを注文する前に、特定の画像を「編集」(トリミング/拡大縮小/回転)する機能です。
ユーザーが編集する前にリモートサーバーに画像をアップロードする必要がないように、次のことを知りたいと思います。
画像をリモートサーバーにアップロードせずに、(JavaScriptを使用して)クライアントマシンに保存されている画像をブラウザー/ブラウザーのメモリにロードして編集できますか?可能な場合、これはどのように行われますか?
おかげで、
BK
Html/Javascriptを使用すると、ファイルアップロードHTMLコンポーネントを使用してのみファイルを選択できます(Flash/Silverlightは、これをラップして物事を簡単にしますが、サンドボックス化されています)
ただし、Javaアプレット(または最近では何と呼ばれていても))、ネイティブActiveXコントロール、または.Netコントロールを使用して、追加の機能を提供できます(これは、セキュリティ上の影響と必要なVM /ランタイムフレームワークなど)
Adobe Airまたは他のクライアント側のテクノロジーは機能する可能性がありますが、JavaScriptでこれを実行したいようです。この場合、ファイルをサーバーにアップロードし、そこから操作するのが最善の策です。
*[編集] 2010年以降、この質問に対する回答があったため、テクノロジーは進歩し、htmlはブラウザー内で作成および操作できるようになりました。新しい回答またはこれらの例を参照してください: http://davidwalsh.name/resize-image-canvashttp://deepliquid.com/content/Jcrop.html *
はい、できます!ただし、それを行うには、ブラウザがローカルストレージをサポートしている必要があります。これはHTML5 APIなので、ほとんどの最新のブラウザーで実行できます。 localstorageは文字列データのみを保存できるため、画像をblob文字列に変更する必要があることに注意してください。あなたの画像ソースは次のようになります
これはあなたを助ける短いスニペットです!
if(typeof(Storage)!=="undefined"){
// here you can use the localstorage
// is statement checks if the image is in localstorage as a blob string
if(localStorage.getItem("wall_blue") !== null){
var globalHolder = document.getElementById('globalHolder');
var wall = localStorage.getItem('wall_blue');
globalHolder.style.backgroundImage= "url("+wall+")";
}else{
// if the image is not saved as blob in local storage
// save it for the future by the use of canvas api and toDataUrl method
var img = new Image();
img.src = 'images/walls/wall_blue.png';
img.onload = function () {
var canvas = document.createElement("canvas");
canvas.width =this.width;
canvas.height =this.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0);
var dataURL = canvas.toDataURL();
localStorage.setItem('wall_blue', dataURL);
};
}}else{//here you upload the image without local storage }
この短いスニペットがお役に立てば幸いです。 Localstorageは文字列データのみを保存するので、できません。
ちなみに、jcropを使用して画像をトリミングしている場合は、blobコードを画像からフォームに保存し、それを手動でサーバーに送信する必要があります。
幸運を! :D