【问题标题】:Windows Phone 8.1 one line equivalent for getPixels & createBitmap from Android?Windows Phone 8.1 一行相当于 Android 的 getPixels 和 createBitmap?
【发布时间】:2014-09-03 12:21:13
【问题描述】:

我正在将一些代码从使用 android-jhlabs library 的 Android 应用程序移植到 Windows Phone 8.1 运行时应用程序。

代码非常简单,基本上如下所示(在 Java 中):

PointillizeFilter filter = new PointillizeFilter();
filter.setEdgeColor(Color.BLACK);
filter.setScale(10f);
filter.setRandomness(0.1f);
filter.setAmount(0.1f);
filter.setFuzziness(0.1f);
filter.setTurbulence(10f);
filter.setGridType(PointillizeFilter.SQUARE);
int[] src = AndroidUtils.bitmapToIntArray(artWork);
src = filter.filter(src, width, height);
Bitmap destImage = Bitmap.createBitmap(src, width, height, Config.ARGB_8888);

在 Java 中:

public static int[] bitmapToIntArray(Bitmap bitmap){
    final int bitmapWidth = bitmap.getWidth();
    final int bitmapHeight = bitmap.getHeight();

    int[] colors = new int[bitmapWidth *  bitmapHeight];
    bitmap.getPixels(colors, 0, bitmapWidth, 0, 0, bitmapWidth, bitmapHeight);

    return colors;
}

我已将此函数转换为 C#,但有一点问题:

 public static int[] bitmapToIntArray(BitmapImage bitmapImage)
    {
        int bitmapWidth = bitmapImage.PixelWidth;
        int bitmapHeight = bitmapImage.PixelHeight;

        int[] colors = new int[bitmapWidth * bitmapHeight];

         // how to convert line below?
        //bitmap.getPixels(colors, 0, bitmapWidth, 0, 0, bitmapWidth, bitmapHeight);

        return colors;
    }

查看文档,我看到很多不同的位图类:WriteableBitmap、BitmapImage、BitmapEncoder 和 BitmapDecoder。我没有找到适用于 Windows Phone 8.1 的 getPixel 类,但有一个适用于 Windows Store 应用程序的类。即使在那里,也只是为了获得一个像素。

createBitmap() 命令也是如此。我找不到任何等价物。

我的问题是,对于 Windows Phone 8.1,getPixels() 和 createBitmap() 命令是否有一行等效项?最好使用BitmapDecoder 吗?

【问题讨论】:

    标签: c# windows-phone-8.1


    【解决方案1】:

    您必须使用 BitmapDecoder:

    StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
    IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
    
    var pixelData = await decoder.GetPixelDataAsync();
    var pixels = pixelData.DetachPixelData();
    
    var width = decoder.OrientedPixelWidth;
    var height = decoder.OrientedPixelHeight;
    
    for (var i = 0; i < height; i++)
    {
        for (var j = 0; j < width; j++)
        {
            byte r = pixels[(i * height + j) * 4 + 0]; //red
            byte g = pixels[(i * height + j) * 4 + 1]; //green
            byte b = pixels[(i * height + j) * 4 + 2]; //blue (rgba)
        }
    }
    

    【讨论】:

    • 感谢您的回答。我试过了,但是无论我如何使用它,代码都不会在第一行之后运行。我将其放入以下函数调用中:public static async Task&lt;int[]&gt; bitmapToIntArray(Image bitmapImage) 并返回一个 int[] 数组。我确实将“fileName”替换为我要打开的 jpg 图像的名称。我使用这行代码在我的主代码中调用这个函数:int[] src = PixelUtils.bitmapToIntArray(userImage).Result; 关于我可以尝试什么的任何进一步建议?
    • 跟进问题链接以防其他用户将来遇到类似问题:link
    • LocalFolder.GetFileAsync(fileName) == 应用程序本地文件夹中的文件,如果您不会从 sdcard 或手机获取文件,请使用 filePicker
    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多