3

重複の可能性:
ファイルサイズが減少せず、画像の品質が低下する場合、Coldfusionで画像のサイズを変更する必要があるのはなぜですか?

私はここで何か間違ったことをしているに違いありません...Coldfuison8を使用しています

外部サーバーから画像を取得する製品検索があるので、実行時に画像を設定する必要があります。

外部サーバーから取得しているjpg500x500px111kbがあるとします。

今私はこれをやっています:

<cfimage name="myImage" source="#bildpfad##bilddateiname#" action="read" />
<cfif IsImage(myImage) is true>
    <cfscript>
    ImageSetAntialiasing(myImage,"on");
    variables.breite = 400;
        ImageScaleToFit(myImage, variables.breite,"", "highestPerformance");
    </cfscript>
<cfxml variable="imageXml">
    <cfimage action="writetobrowser" source="#myImage#" />
</cfxml>
<cfoutput><div class="resultsImgWrap">#imageXml#</div></cfoutput>

これで画像は大丈夫ですが、ファイルサイズを確認すると

400x400px 111.2kB

たとえば、IrfanViewを使用して、ファイルサイズを縮小して画像を保存した場合、すでに65kbになっています。

質問:画像のサイズを変更する場合、CFIMAGEでファイルサイズを小さくするにはどうすればよいですか?サイズが111kbのままの場合は、画像を単純なHTMLとして追加するのではなく、CFIMAGEを使用するのはなぜですか。

**編集'':
変数BildpfadとBilddateinameは次のようになります:

bildpfad (path to image):         http://www.some-server.com/images/
bilddateiname (filename):         some_image123.jpg
4

3 に答える 3

2

qualityで属性を指定します<cfimage>。で動作するかどうかはわかりませんが、動作action="writeToBrowser"するはずです。それ以外の場合は、バグレポートを提出してください。

サイズ変更と圧縮は別のものです。:)

参照:ファイルサイズが減少せず、画像の品質が低下する場合、Coldfusionで画像のサイズを変更する必要があるのはなぜですか?

アップデート

良いニュースですが、それを機能させるための文書化されていない方法があります!参照: http: //www.bennadel.com/blog/2405-Using-The-Quality-Attribute-With-The-CFImage-WriteToBrowser-Action.htm

<!--- Write out as a JPG at 20% (using "quality" attribute). --->
<cfimage
    action="writeToBrowser"
    source="#png#"
    format="jpg"
    quality=".2"
    />
于 2012-07-13T16:44:50.227 に答える
1

画像のサイズを変更するのは、ファイルサイズをバイト単位で小さくすることを意図したものではありません。高さと幅を小さくするためです。はい、多くの場合、画像ファイルのサイズは小さくなります。ただし、そのサイズの縮小はソース画像によって異なります。

ファイルを小さくするのに役立つ可能性があるため、フォーマットをpngとして宣言することをお勧めします。

また、なぜcfimageタグをcfxmlでラップしているのですか?これは、余分な処理と肥大化を引き起こしている役に立たないステップです。

于 2012-07-13T15:37:55.723 に答える
1

'action = "writetobrowser"'を使用すると、ソースイメージのコピーが使用されます。ブラウザにプッシュされ、後で破棄される一時ファイルを作成します。

CF8ドキュメントからのフレーズは次のとおりです。

「writeToBrowserアクションを使用して、1つ以上のColdFusionイメージをファイルに書き込まずにブラウザに直接表示します。」

大きな写真(4608x3456)@3.47MBのCF8でコードをテストしました。ブラウザに表示されていた画像のサイズが400x300@247.47KBに変更されました。Firefoxを右クリックして使用しました| サイズ変更された画像情報を取得するには、画像情報を表示します。Firebug|を使用することもできます 送信された画像サイズを取得するためのネットタブ。

サイズ変更された画像は「/CFFileServlet/_cf_image/」にあります。

元のファイルのサイズ(#bildpfad ## billddateiname#)は変更されません。

一時的なものとして設計されたファイルの存在に依存しないでください。一時的とはそれだけを意味します。1つのサイズ変更のファイル名は、同じソースイメージであっても、10分後のサイズ変更で同じファイル名にならない場合があります。一時ファイルは、CFのバージョンによっても異なる方法で処理される場合があります。

サイズ変更された画像のコピーを保持する必要がある場合は、destination属性を指定してaction="write"またはaction="resize"を使用し、サイズ変更された画像のコピーをCFサーバーに保存します。

これがどのように機能するかのサンプルです:

<!---assume that bildpfad can be different domains/folders--->
<!---RegEx = remove protocol, replace '/' with '!',  replace '.' with '~'--->
<cfset slashReplacement = "!">
<cfset periodReplacement = "~">
<cfset imageFilename = REReplace(REReplace(REReplaceNoCase(bildpfad, "https?://", "", "one"), "\/", slashReplacement, "all"), "\.", periodReplacement, "all") & bilddateiname>
<!---resizedImgDestination is a web path--->
<cfset resizedImgDestination = "/images/resized/rs_#imageFilename#">
<!---debug info, can comment out when working--->
<cfoutput>source = [#bildpfad##bilddateiname#]<br />destination = [#ExpandPath(resizedImgDestination)#]<br /></cfoutput>
<!---/debug info, can comment out when working--->
<cfif NOT FileExists(ExpandPath(resizedImgDestination))>
    <cfhttp url="#bildpfad##bilddateiname#" result="stGetImg" resolveurl="no" useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1" timeout="45" getasbinary="yes" throwonerror="no" />
    <cfset myImage = ImageNew(stGetImg.FileContent)>
    <cfif IsImage(myImage)>
        <cfimage action="resize" destination="#ExpandPath(resizedImgDestination)#" height="" isbase64="false" overwrite="true" source="#myImage#" width="400" />
    </cfif>
</cfif>
<cfoutput><img src="#resizedImgDestination#" /></cfoutput>

高さを空の文字列のままにしておくと、幅に比例して高さのサイズとスケーリングが変更されます。

サイトのWebルートから「/images/resized/」フォルダを作成する必要があります。

ExpandPath()は、静的パス定義を使用するよりも優れています。サイトを別のサーバーまたはOSに移動する必要がある場合は、時間を大幅に節約できます。

注:質問の変数の使用に合うように、上記のコードを更新しました。画像の読み方も変更しました。CHF 4+ホットフィックスがインストールされたCF8.01を使用していますが、リモートファイルの読み取り時にcfimageでエラーが発生しました(JPG処理で例外が発生しました。セグメントサイズがファイルストリームの長さを超えます)。私の解決策は、代わりにcfhttpを使用して画像を読み取ることでした。また、より適切な名前の変数「resizedImgDestination」を使用するようにコードを更新しました。

于 2012-07-13T21:21:15.587 に答える