Tôi đang làm việc trên ứng dụng Windows 8 Metro áp dụng bộ lọc cho hình ảnh. Tôi có một phiên bản web của ứng dụng và muốn chuyển nó. Nhưng như chúng ta đều biết WinRT không có tất cả những điều tốt đẹp. NET cung cấp cách khác:/C# Windows 8 Store (Metro, WinRT) mảng Byte tới BitmapImage
Hiện tại tôi đang áp dụng bộ lọc trên mảng byte và tôi muốn giữ nó theo cách đó, vì nó siêu nhanh! Vì vậy, trong vài ngày qua, tôi đã tìm kiếm các cách để chuyển đổi một StorageFile thành byte [] và sau đó là byte [] thành BitmapImage.
Cho đến giờ tôi đã thực hiện thao tác đầu tiên (StorageFile thành byte []). Đây là cách tôi làm điều đó:
public async Task<Byte[]> ImageFileToByteArray(StorageFile file)
{
IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
return pixelData.DetachPixelData();
}
Đoạn mã này trả về một byte[]
chứa dữ liệu pixel là BGRA.
Và đây là phần khó khăn. Tôi không thể chuyển đổi thành công mảng byte thành bitmapImage. Tôi đã tìm kiếm trên tất cả các nơi và nhiều người đề nghị sử dụng WriteableBitmap nhưng điều đó không làm tốt cho tôi nhiều. Tôi cũng đã tìm thấy một số đoạn mã nên hoạt động ... nhưng chúng không.
Một trong những giải pháp tôi đã cố gắng sử dụng InMemoryRandomAccessStream như thế này:
public async Task<BitmapImage> ByteArrayToBitmapImage(Byte[] pixels)
{
var stream = new InMemoryRandomAccessStream();
await stream.WriteAsync(pixels.AsBuffer());
stream.Seek(0);
var image = new BitmapImage();
await image.SetSourceAsync(stream);
return image;
}
Cái này ném ngoại lệ sau đây:
Một ngoại lệ của loại 'System.Exception' xảy ra trong mscorlib. dll nhưng không được xử lý trong mã người dùng
Thông tin bổ sung: Không tìm thấy thành phần. (Ngoại lệ từ HRESULT: 0x88982F50)
tôi đã cố gắng sử dụng dòng này thay vì:
PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
new BitmapTransform(),
ExifOrientationMode.IgnoreExifOrientation,
ColorManagementMode.DoNotColorManage);
Nhưng nó đã làm cho tôi không tốt kể từ khi tôi tiếp tục nhận ngoại lệ đó.
Tôi cũng đã cố gắng này:
var bitmapImage = new BitmapImage();
var pixels = await ImageFileToByteArray(file);
ImageSource imgSource;
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
{
writer.WriteBytes(pixels);
await writer.StoreAsync();
}
await bitmapImage.SetSourceAsync(ms);
imgSource = bitmapImage;
}
Và có được ngoại lệ tương tự như phần đầu tiên của mã.
Tôi cũng đã thử một số cách khác bao gồm sử dụng Luồng bình thường rồi chuyển đổi thành IRandomAccessStream nhưng chúng cũng không hoạt động.
Tất cả các mã trên có vẻ tốt với tôi. Vì vậy, tôi đoán tại thời điểm này là vấn đề là trong byte[]
. Tôi đoán rằng định dạng của pixelData bên trong không hợp lệ, vì vậy tôi đã thử thay đổi nó thành RGBA nhưng điều đó cũng không giúp được gì. Ngoài ra PixelHeight và PixelWidth của BitmapImage là 0.
Bạn đã tìm thấy giải pháp cho điều này chưa? Tôi cũng gặp vấn đề tương tự. – TheQuestioner