【问题标题】:Image Quality distort when minimize the height and width of bitmap最小化位图的高度和宽度时图像质量失真
【发布时间】:2013-08-31 22:46:41
【问题描述】:

我有一个从互联网下载的bitmap,现在我想减小位图的高度和宽度,同时又不损失bitmap 的质量。如何实现这一点。

这是从互联网上下载位图的方式。

URL url_1 = null;
try {
    url_1 = new URL(vmImageUrl);
    bmp = BitmapFactory.decodeStream(url_1.openConnection().getInputStream());
    } catch (Exception e) {
    Log.v("Error while downloading bitmap from url", e.getMessage());

我已经这样缩放了。

Bitmap.createScaledBitmap(bmp, convertDpToPixel(140, context), convertDpToPixel(35, context), false);

此方法将 dp 单位转换为以像素为单位的等效设备特定值。

public static int convertDpToPixel(float dp,Context context)  
{
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    int px = (int) (dp * (metrics.densityDpi/160f));
    return px;
}

【问题讨论】:

    标签: android


    【解决方案1】:

    使用BitmapFactory.Options.inSampleSize 获得更小的位图。

    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inSampleSize = 2;
    Bitmap bitmap = BitmapFactory.decodeFile(YOUR_FILE, opts);
    

    【讨论】:

    • 我想给出新位图的高度和宽度..这里我不能
    • 是的,输出的位图与原始位图的纵横比相同,output.width = 1/inSampleSize * original.width。但是如何在不保持纵横比的情况下保持位图的质量。
    • 我想指定位图的宽度和高度,就像我们使用 Bitmap.createScaledBitmap(bmp, VirtualMirrorActivity.convertDpToPixel(140, context), VirtualMirrorActivity.convertDpToPixel(35, context), false);
    • 如果您指定的宽度和高度与原始值的纵横比有很大差异,则您正在扭曲图像,它肯定会失去质量。
    【解决方案2】:

    我设置了这个。

    Bitmap.createScaledBitmap(bmp, convertDpToPixel(140, context), VirtualMirrorActivity.convertDpToPixel(35, context), true);
    

    而不是

    Bitmap.createScaledBitmap(bmp, convertDpToPixel(140, context), VirtualMirrorActivity.convertDpToPixel(35, context), false);
    

    它提供更平滑的边缘和清晰的位图。现在它工作正常..

    【讨论】:

      【解决方案3】:

      你需要 2 个矩形,

      Rect src = new Rect();
      Rect dst = new Rect();
      

      然后你可以设置当前图像的src,

      src.set(0,0,imgWidth,imgHeigth);
      

      然后是所需的大小

      dst.set(startX,startY,endX,endY);
      

      注意:startX 和 startY 将是屏幕上的目标坐标 并且您的图像将被绘制到 endX endY 坐标。 用 Canvas 画出你的小人

      Canvas.drawBitmap(bitmapFile, src, dst, null);
      

      【讨论】:

      • 我的问题是差异不在画布上绘制位图我需要在降低高度和宽度后质量位图..
      • 好吧,我的错,你可以在加载 BitmapFactory.Options options = new BitmapFactory.Options() 之前设置位图的首选 RGB; options.inPreferredConfig = Bitmap.Config.RGB_565; bitmap = BitmapFactory.decodeStream(is, null, options);
      猜你喜欢
      • 2018-12-02
      • 2010-12-28
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      相关资源
      最近更新 更多