locked
对图片就行裁剪,提示分配的缓存区不足 RRS feed

  • 问题

  • IRandomAccessStream tx = await ImageFile.OpenAsync(FileAccessMode.Read);
    Stream stream = WindowsRuntimeStreamExtensions.AsStreamForRead(tx.GetInputStreamAt(0));
    MemoryStream ms = new MemoryStream();
    await stream.CopyToAsync(ms);
    byte[] bytes = ms.ToArray();

    BitmapEncoder en = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, tx);

              en.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, 960, 1280, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi, bytes);

                             
                              StorageFile Thumbanil = await Image_ThumbNail.CreateFileAsync(ImageFile.Name, CreationCollisionOption.ReplaceExisting);//创建文件,并以原图的名字作为名字
                              using (IRandomAccessStream Istream = await Thumbanil.OpenAsync(FileAccessMode.ReadWrite))//写入的相关事宜
                              {
                               
                                 BitmapEncoder en = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId,Istream);
                                  en.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Ignore, (uint)960, (uint)1280, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi, bytes);
                                 await en.FlushAsync();
                                 stream.Dispose(); 

    代码如上,不知道为何会抛出 提示分配的缓存区不足的提示                     
    2016年7月22日 16:05

答案

  • ?????

    • 已建议为答案 [-] 2016年7月24日 8:11
    • 已标记为答案 ARM830 2016年7月24日 16:30
    • 取消答案标记 ARM830 2016年7月24日 16:30
    • 已标记为答案 ARM830 2016年7月27日 3:29
    • 已编辑 [-] 2018年1月11日 12:48
    2016年7月24日 8:11

全部回复

  • 改了代码

    添加 解码

       BitmapDecoder bw = await  BitmapDecoder.CreateAsync(BitmapDecoder.JpegDecoderId, tx);
        var tt = await bw.GetPixelDataAsync();
                         

     “BitmapEncoder en = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId,Istream);
    en.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Ignore, (uint)960, (uint)1280, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi, bytes);“  

    这个地方也改成:

    en.SetPixelData(bw.BitmapPixelFormat ,bw.BitmapAlphaMode, 960, 1280, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi,tt.DetachPixelData());“  

    也成功的运行了,但是运行出来的图片超级怪异..

    有没有比计较的好的办法,修改图片的大小?

    2016年7月23日 15:23
  • 如果改为,解码器的大小,得到的图片不就是原图大小了吗?   确实,改为解码器的,图片会为之正常,但是图片,就是原图了,有没有,可以改变大小的方法?

    2016年7月24日 3:28
  • ?????

    • 已建议为答案 [-] 2016年7月24日 8:11
    • 已标记为答案 ARM830 2016年7月24日 16:30
    • 取消答案标记 ARM830 2016年7月24日 16:30
    • 已标记为答案 ARM830 2016年7月27日 3:29
    • 已编辑 [-] 2018年1月11日 12:48
    2016年7月24日 8:11
  • 我先是获取了图片文件的略缩图,并且保存了下来。(图片文件显示很正常,但是竖着的图片,在略缩图的显示下就会变自动逆时针选择90.横图则不会出现旋转的情况),这算是解决了图片大小的问题

    之后,我对略缩图使用了BitmapTransform这方法,设置顺时针旋转90,但是这个样子经常会出现,花图(就是我上传)

    旋转的图片也是 莫名其妙的,有的是旋转180,但就是不会旋转90....,如果设置其他参数,高度和获取略缩图的参数一样,宽度自定,再加上旋转的参数,出现花的几率很大。 (手机是830)

    缩小是都无所谓,通过BitmapTransform,还是BitmapEncoder,或者是略缩图,只要设置好都会出现,但是啊,这个自动旋转是怎么回事嘛。。。BitmapTransform的旋转参数即便设置为顺时针90°,图片也不会真的旋转90...而是180°..

    2016年7月24日 15:15
  • 多谢了

    对于这个图片自动旋转,我在电脑上(win10)查看这个这个图片(和手机上旋转的图片相同),也是发生了自动旋转

    对于EXIF的数据,我选择的“EXIF 方向标志被忽略” 

    同样是不好使。

    不过很有意思的是,在相同的Image控件下,使用原图,是不会出现旋转的.使用略缩图则会,使用BitmapTransform直接的修改也会出现,但是使用BitmapTransform修改的图片有很几率出现花图。

    不过,手机竖着拍摄的照片,有一定的几率出现不旋转(妈的,比中彩票的几率能大点)。不过当把图片缩小到一定程度时,旋转是可以避免的,比如100/200这种超级小的图片,但是图片会变得很模糊。

    不知道有没有一种可能是,我的Image控件没有设定具体的大小。是使用自动AUTO,所以图片就会这样旋转?

    当然这些目前都不是最主要的,最主要的是我的VS识别不了的我的手机了, 无法具体上机实验。而是用手机模拟器,有没饭办法拍摄图片...真是日乐购。。

    VS2013 不能部署WP8.1到手机上



    • 已编辑 ARM830 2016年7月26日 9:17
    2016年7月26日 9:16
  • 今天我把电脑重置了。可算是可以部署到手机上了。

    我又重写BitmapTransform,这部分代码,忽略EXIF的旋转方向,发现可以旋转了。

    但是吧,发现个问题,发生自旋转的是手机本身手机拍摄的照片,或者说3480*2160的照片,于是我就做了个排除法,只要是这个格式的照片都统统旋转。

    照片旋转本身,对APP体验上是很不好的,我就先对这个3480*2160做旋转处理,等用户自己发现一些照片会旋转后,在做具体处理了。

    目前,就就只能对3480*2160的照片做旋转和加上旋转的Button,如果对有旋转的照片,用户自己旋转....

    这几天,你帮我找了这么的资料,我也是学习很多,谢谢。

    2016年7月27日 3:29