WindowsPhone8.1的getPixels&;从Android创建位图
本文关键字:Android 创建 位图 amp getPixels WindowsPhone8 | 更新日期: 2023-09-27 18:20:33
我正在使用Android jhlabs库将一些代码从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应用商店的类。即使在那里,它也只是为了获得一个像素。
createBitmap()命令也是如此。我找不到任何类似的东西。
我的问题是,对于WindowsPhone8.1,getPixels()和createBitmap()命令有一行等效的命令吗?最好使用BitmapDecoder吗?
您必须使用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)
}
}