为什么这个位图图像在加载后会改变它的大小?

时间:2016-08-24 15:51:45

标签: c# bitmap bitmapsource

快速提问:

我有 1000 x 1000 位图图片:

enter image description here

我使用此例程加载它:

private BitmapSource initialBitmap = new BitmapImage(new Uri("C:\\Users\\...\\Desktop\\Original.bmp"));

为什么在我加载之后,在我跨过上面一行后,我将其视为 800 x 800

enter image description here

P.S我希望它是1000 x 1000并且不使用任何Resize功能。它正在工作,突然它是800 * 800!

2 个答案:

答案 0 :(得分:4)

BitmapSource.WidthBitmapSource.Height返回的值不是像素,而是WPF的设备无关单位,总是96 dpi。 E.g:

  

以与设备无关的单位(每单位1/96英寸)获取位图的宽度。

如果您想知道实际的像素宽度和高度,则需要使用PixelWidthPixelHeight属性。

你的问题不是很具体,但如果你真正关心的是将位图显示的大小与创作的大小相同,那么最简单的解决方案就是确保以96 dpi的速度创作。无论您使用什么程序来创作位图,都可以在其中设置位图分辨率。通常,这可以在改变或不改变图像的像素尺寸的情况下设置(即,将图像缩放得更大或更小);你想在不缩放图像的情况下做到这一点,这样像素尺寸保持不变,但dpi会改变以匹配WPF正在使用的内容。

请注意,这仍然不能保证特定像素大小的位图显示。显示分辨率可以且通常不同于96 dpi,在这种情况下,WPF将缩放图像以确保图像的物理尺寸(即以英寸,毫米等为单位的尺寸)根据位图中的信息是正确的。例如,96 dpi时960像素宽意味着10“宽。在120 dpi显示器上,这意味着显示足够大的位图,使其宽度使用1200个显示像素。

如果您希望或需要位图以完全相同数量的显示像素显示,而不管显示分辨率如何,那么您必须设置一个转换,您可以在其中显示图像以反转WPF将缩放的效果否则呢。当然,这需要知道显示分辨率。


以下是一些您可能会觉得有用的其他相关Stack Overflow问题: RenderTargetBitmap renders image of a wrong size
WPF for LCD screen Full HD
Screen Resolution Problem In WPF?

答案 1 :(得分:3)

这是设计的。请注意 try { URL url = new URL(urlString); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); urlConnection.setRequestProperty("Content-Type", "application/json"); urlConnection.setRequestProperty("Accept", "application/json"); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.setRequestMethod("POST"); String userCredentials = "xxxxxxxx"; //TOKEN String basicAuth = "Basic " + Base64.encodeToString((userCredentials).getBytes(), Base64.DEFAULT); urlConnection.setRequestProperty ("Authorization", basicAuth); JSONObject jsonObject = new JSONObject(); jsonObject.put("account_id", params[1]); jsonObject.put("method", params[2]); jsonObject.put("test", params[3]); jsonObject.put("data[number]", params[4]); jsonObject.put("data[verification_value]", params[5]); jsonObject.put("data[first_name]", params[6]); jsonObject.put("data[last_name]", params[7]); jsonObject.put("data[month]", params[8]); jsonObject.put("data[year]", params[9]); OutputStreamWriter os= new OutputStreamWriter(urlConnection.getOutputStream()); os.write(jsonObject.toString()); os.flush(); int responseCode = urlConnection.getResponseCode(); Log.d(TAG, "IUGU responsecode " + responseCode); StringBuilder responseStrBuilder = new StringBuilder(); BufferedReader reader = new BufferedReader( new InputStreamReader(urlConnection.getInputStream(), "UTF-8")); String inputStr = null; while ((inputStr = reader.readLine()) != null) responseStrBuilder.append(inputStr); InJsonObject = new JSONObject(responseStrBuilder.toString()); id = InJsonObject.get("id").toString(); Log.d(TAG, "IUGU id " + id); os.close(); 的{​​{3}}:

  

以与设备无关的单位(1/96英寸)获取位图的宽度   每单位)。 (重写ImageSource.Width。)

相反,您应该使用BitmapSource.Width/Height / PixelWidth属性:

  

以像素为单位获取位图的宽度。

一个相当令人困惑的选择或条款,imo,但你去了..