0
var bd:BitmapData=new BitmapData(file.width,file.height);
bd.setPixels(new Rectangle(0,0,file.width,file.height),file.raw);

var scale_x_percents:Number = (w / bd.width);
var scale_y_percents:Number = (h / bd.height);
if(!stretch) {
    if(bd.width*scale_y_percents>=w) {
        scale_x_percents=scale_y_percents;
    }
    else if(bd.height*scale_x_percents>=h) {
        scale_y_percents=scale_x_percents;
    }
}
var matrix:Matrix = new Matrix();
matrix.scale(scale_x_percents,scale_y_percents);

var resizedBd:BitmapData = new BitmapData(Math.floor(bd.width*scale_x_percents), Math.floor(bd.height*scale_y_percents), true, 0x000000);
resizedBd.draw(bd, matrix, null, null, null, true); // true is smoothing option, it will blur sharpened pixels

画像のサイズ変更に問題があります。スムージングが機能していないか、コードに何かが欠けているようです。多分マトリックスはもっと何かを持っているべきですか?

元の画像:

http://imageshack.us/a/img28/4784/dc7f2ec4b0f3323cdc4e01e.jpg

そしてそれは結果です:

http://imageshack.us/a/img855/4784/dc7f2ec4b0f3323cdc4e01e.jpg

たくさんの他の画像をリンクできます。いくつかの奇妙なピクセル配置が存在します。どうにか直せますか?

jpeg 品質 100% と stage.quality='best' をテストしましたが、必要な品質結果が得られるものはありません。

4

1 に答える 1

4

BitmapData 上に BitmapData を描画するときの問題は、「最も近い」サンプリング モードのようです。おそらく、次のことが役立つかもしれません。

var sh:Shape=new Shape();
sh.graphics.beginBitmapFill(bd,matrix,false,true);
sh.graphics.lineStyle(0,0,0); // no lines border this shape
sh.graphics.drawRect(0,0,resizedBD.width,resizedBD.height);
sh.graphics.endFill();
resizedBD.draw(sh); // or with smoothing on

Flash のネイティブ グラフィック レンダラーを使用すると、描画されたビットマップに対して少なくとも双一次補間が実行される可能性が高く、これが目的の結果であるように見えます。また、stage.qualityその形状がステージに追加された場合にも適用されます (ちなみに、形状を使用してアップロードされた写真を表示し、保存するために BitmapData を描画できます)。 .

于 2013-03-18T11:41:41.593 に答える