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 回答