小尺寸,高分辨率图像。

4
我创建了一个名为it(应用A)的应用程序,需要在res drawable文件夹中存储大量高分辨率图像(我知道可以远程下载,但需要将其保留在drawable res文件夹中),它是:
3000 x 4000像素的数字相机拍摄的JPEG图像,这将导致应用程序大小不可接受的增加,并导致在设备上运行时出现内存异常。因此,我们能否创建另一个名为app B的应用程序,专门用于调整图像大小,它将选择存储在SD卡上的这些图像(仅用于调整大小),然后将其调整为较小的图像大小,但不损失图像质量并保持高分辨率,然后再次保存为PNG或JPEG格式到SD卡,然后我可以从SD卡中取出图像,然后保存到(应用程序A)的资源文件中并使用它,具有合理的大小和高分辨率。
希望如果有人能提供解释或应用此的完整代码答案的教程或链接。
注意:我尝试使用计算机软件如photoshop或format factory,但所有都会影响分辨率。
非常感谢你的帮助。

如果您想要更低的分辨率或更小的尺寸,那么您将会失去图像质量。 - AHungerArtist
@AHungerArtist 我知道,但每张图片大约有4-5 MB大小,使用大约250张图片会导致应用程序体积巨大和设备卡顿,你有什么建议来解决这个问题吗?谢谢。 - androidqq6
4个回答

4
这个问题可以通过图像平铺来解决。你可以把你的图片分成许多较小的“瓷砖”,比如500x500像素,然后按照网格布局排列 - 选择你喜欢的布局方式。在渲染缩放时,只会绘制那些在屏幕上的瓷砖。
以下链接提供了更详细的信息:如何在Android中平铺和滚动大型图片(10000x10000) 按照这里的说明来分割图片:Android - 分割Drawable 为了实现真正流畅的行为,除了原始图像外,还可以从原始图像中创建一个缩小的图像,并在缩小网格时使用缩小的图块。当用户缩放时,切换回原始分辨率。 编辑

我的目标是有一张3000 * 4000 分辨率的大图片,我想将其转换为较小的尺寸但保持相同的分辨率。

需要记住几个概念:
  1. 图片的原始分辨率(在您的情况下为3000x4000像素)
  2. 显示器的分辨率。例如,Nexus 4的显示器分辨率为768x1280像素。显示器有一个重要的属性:DPI或每英寸点数。这是一英寸(25.4毫米)物理屏幕上共同测量的像素数量。苹果iPhone上的“视网膜”显示器具有326 DPI-这是锐度的基准;在此屏幕上,像素对于人眼来说太小了,在典型的持握距离下无法单独/清晰地看到。旧的单色液晶显示器的DPI在30-60范围内-您可以轻松看到单个像素的正方形形状。
  3. 要在显示器上显示的图片部分-视口。有两种不同的极端:

    1. 缩小:您希望在显示器上显示完整的图片。在您的情况下,图片的像素比显示器多(显示器具有不足的像素以显示原始分辨率的原始图片),因此,显示器上的一个像素将呈现一组像素从图片中平均颜色和亮度,或
    2. 自然分辨率:自然分辨率是指原始图像的一个像素恰好显示在屏幕上的一个像素上。在您的情况下,您只能看到大约四分之一的图像。这种缩放具有最大的锐度,但是图像的某些细节可能太小而无法看到,因为眼睛实际上无法看到单个显示像素。
    3. 放大:您希望在显示器上显示更小的图片部分,其中来自图片的原始像素实际上大于显示器。在此处,图片中的一个像素将显示在显示器上的多个或许多像素上。

现在,Android图像库将提供帮助。当您在显示器上呈现图像时,库将缩放图片以“适应”显示器上的像素-您的实际图片将不会改变。

我希望通过这种新语言,您可以看到基本约束条件,因此可以决定如何继续。


我支持你的回答...但是你可以使用1024x1024的图片...每个安卓手机都支持这么大的位图! - silly
当然 - 根据可用的RAM,它们将支持非常大的图像。问题在于CPU重新调整图像的速度。图像越大,速度越慢,因此捏合缩放会非常卡顿。对于较小的图像,并且在小部分上进行缩放,CPU只需缩放1kx1k图像中的一个。 - Andrew Alcock
@AndrewAlcock先生,感谢您的回答。实际上,我还是个新手,对于Android和Java开发还不是很熟悉。您能否再给我解释一下?我的目标是将一个3000*4000分辨率的大图片转换为较小的尺寸,但保持相同的分辨率。再次感谢。 - androidqq6
@Andrew Alcock先生,感谢您的回答。实际上我还是Android和Java开发的新手,您能否再给我解释一下?我的目标是将一张3000*4000分辨率的大图片转换为较小的尺寸,但保持相同的分辨率。再次感谢。 - androidqq6
增加了有关图像、显示和视口的讨论。 - Andrew Alcock

1

使用BitmapFactory.Options.inSampleSize来读取一个子采样的位图。

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

使用Bitmap.compress()将位图保存到SD卡。

编辑: 如果您仍然想保留分辨率,可以尝试设置BitmapFactory.Options.inPreferredConfig = Bitmap.Config.RGB_565;来解码位图,这可以将内存成本减少一半,因为大多数默认配置是RGB_8888。


请问您能否写出更详细的代码,包括以下三个方面:1-从SD卡中选择图片;2-调整大小;3-再次以PNG格式保存。谢谢。 - androidqq6
不,这种方法行不通。inSampleSize会改变分辨率并减小尺寸。 - Royston Pinto
@Royston Pinto,我是Android的新手,希望能够得到正确的解决方案,而不会影响质量。谢谢。 - androidqq6
1
抱歉,我没有注意到。但是如果您想保持分辨率,无论您做什么,内存成本都不会改变。 - faylon
基本上,inSampleSize = 2 将把宽度/2、高度/2 和 totalSize/4 进行除数运算。因此,一个大小为 4MB 的图像将变成一个宽高减半的1MB 图像。 - Royston Pinto

1

正如您所说,您已经尝试了Photoshop并得到了不可接受的分辨率结果,

在Photoshop CS和CS2中发现了一个简单的技巧:

When you want to reduce an image go to the Image> Image Size menu. Click on 
Resample Image and choose Bicubic Sharper from the drop-down menu. This is the 
best setting for making sure that an image doesn't blur. The example photo of the
flower started at 2,000 pixels across. I stepped it down to 250, and then again 
to 125 with almost no loss of sharpness. 

还有一件事需要记住

when resizing is to try to do it only once on an image.
Many people will resize repeatedly as they search for the perfect fit for 
a design element, and then end up with an image with a lot of blur. It's always
better to experiment on a duplicate of the image. Then, when you've settled on 
the final dimensions, you can go back to the original and resize it just once.

我已经亲自尝试过,并获得了高质量的图像分辨率和小文件大小。

参考链接:http://www.photoshopsupport.com/tutorials/jennifer/bicubic.html

希望这能有所帮助。


1

基本上有三种方法可以减小图像的大小:

  • 减小其尺寸和/或质量(例如通过减少像素数量或每个像素的大小)- Jpeg会执行类似操作。
  • 压缩文件-这就是GIF和PNG所做的。
  • 使用矢量图形。

由于您正在讨论进一步压缩数字相机JPEG图像,因此除非失去更多质量(JPEG已经同时降低了质量并压缩了文件,这就是为什么它是Web上最常用的类型),否则您无法进一步减小图像本身的大小。 任何试图在不进一步降低质量的情况下压缩文件的尝试都不会给您带来太大的优势(尽管您可以尝试几种不同的压缩方案,但很少有机会找到恰到好处的方案以获得一些实质性的减少)。

理论上,如果您可以将所有图像合并成单个图像,并将其作为单个图像进行压缩,则可能会获得一些优势,但是当涉及到如此大的文件大小时,您很难处理这样一个巨大的文件。


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