如何将图像调整为高分辨率图像而不丢失像素?

3

我正在处理一些图像处理任务。

我使用getDrawingCache()createScalledBitmap()创建了低分辨率位图。

但是当我将这个图像调整为高分辨率,比如612 X 612时,我的图像变得模糊了。看起来很糟糕。

是否有任何方法可以调整图像的高分辨率而不失去像素?OpenCV有这种类吗?


5
如果没有进行高级图像处理,放大图像就会导致模糊,这是无法避免的。这种高级处理并不是免费获得的。你并不是失去像素,而是需要创造魔法一样的新像素来填补已有像素之间的空隙。 - cjk
3个回答

5
你做不到。如果你的图片是200x200,那么它包含多少个像素信息就是多少。如果你将其放大,它仍然只有相同数量的信息,只是需要在更广阔的区域上展开。
可以这样想 - 假设你有一个只有一个像素,且该像素为蓝色的图像。现在你想将该图像缩放至两个像素。第二个像素应该是什么颜色呢?答案:可以是任何颜色。第一个像素中没有足够的信息来决定第二个像素应该是什么颜色,因此无法决定第二个像素的颜色。
所以,这不是“失去像素”的问题,而是添加新像素的问题,而这些像素没有关于它们应该是什么样子的信息。因此,调整大小使用它已有的信息,基本上就是:“使插入/新像素与最近的相邻预先存在的像素颜色相同”。

有一些算法和技术可用于插值(猜测)插入的像素应该看起来像什么,以避免锯齿状边缘等问题。维基百科提供了一些关于各种基于插值的缩放技术超采样的信息作为起点。请注意,这些技术都不会创建新的信息,它们只是平滑边缘并使缩放后的图像看起来不那么锯齿状。


但是我该如何获取此代码的示例?我正在使用Android环境SDK版本2.2。请提供一些链接,让我可以获取在Android中调整图像大小的好样例代码。告诉我是否有可用的API或JAR。 - Mady Cool
如果你搜索一下,网络上有很多相关的资源可供使用。例如,你可以在这里查看:https://dev59.com/GHRA5IYBdhLWcg3wzhbZ。 - pap

1

我已经使用资产解决了这个问题。

(1) 将所有图像放入资产文件夹中

(2) 使用输入流读取图像

现在我不需要调整大小,它可以按照我想要的方式正常工作。就像这样:

private void setThemeBackgroundImage(String imageName, Button themeButton) {

        try {
            InputStream backgroundBitmap = getAssets().open(imageName);
            Bitmap immutableBitmap = BitmapFactory
                    .decodeStream(backgroundBitmap);

            themeButton.setBackgroundDrawable(new BitmapDrawable(
                    getResources(), immutableBitmap));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

1
你需要做的是创建一个大小为612X612的原始图像,然后将其缩小并另存为其他名称,这样你就有了一个原始大图像和一个小图像。从大到小的尺寸很容易,而从小到大则不然。

谢谢您的回复。但是我已经提到了我使用了getDrawingCache(),它给了我特定视图大小的位图。我的视图不是很大。它大约是200 X 200。所以生成的位图具有相同的大小,我想要高分辨率的位图。 - Mady Cool
非常感谢您的回复。我已经找到了示例演示,并且它的工作方式正是我想要的。这是链接:http://www.wiseandroid.com/post/2010/09/16/Porting-C-code-HQ4X-pixel-scaling-algorithm-on-Android.aspx - Mady Cool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接