- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在过去的一周里,我一直在尽可能多地研究如何在我的 Windows 应用商店应用程序中添加裁剪个人资料图像的功能。到目前为止,我已经查看了 Microsoft 对此的解决方案,但决定采用不同的方法。我从 NuGet 下载了一个名为 XamlCropControl 的控件。它在 UI 上工作得很好,甚至给我信息,如原始高度/宽度裁剪的顶部/底部/左/右/宽度/高度的位置都在 xaml 控件中。我的问题是如何获取该信息并使用 WriteableBitmapEx 裁剪图像。到目前为止,这是我的代码,但我遇到了问题。
private async void ProfilePhotoImageClick(object sender, TappedRoutedEventArgs e)
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null)
{
using (Windows.Storage.Streams.IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(fileStream);
BackgroundLogo.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
PhotoUploadCropper.Opacity = 1;
PhotoUploadCropper.ImageSource = bitmapImage;
ProfileSetupStackPanel.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
imagetoResize = bitmapImage;
}
}
}
BitmapImage imagetoResize;
private void AcceptPhotoImageCropClick(object sender, RoutedEventArgs e)
{
WriteableBitmap bmp = new WriteableBitmap(0,0).FromContent(imagetoResize);
var croppedBmp = bmp.Crop(0, 0, bmp.PixelWidth / 2, bmp.PixelHeight / 2);
croppedBmp.SaveToMediaLibrary("ProfilePhoto.jpg");
}
PhotoUploadCropper 是 xamlcropcontrol。
This is the information from xamlcropcontrol
它告诉我,如果我在那里有 (imagetoResize),那么 FromContent 没有定义,但如果我删除它,我就不会出错。完成所有裁剪后,它将上传到我已经设置的 azure blob 存储。
编辑:像这样工作。
private async void ProfilePhotoImageClick(object sender, TappedRoutedEventArgs e)
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null)
{
using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read))
{
BitmapImage bitmapImage = new BitmapImage();
await bitmapImage.SetSourceAsync(fileStream);
fileclone = file;
BackgroundLogo.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
PhotoUploadCropper.IsEnabled = true;
PhotoUploadCropper.Opacity = 1;
PhotoUploadCropper.ImageSource = bitmapImage;
ProfileSetupStackPanel.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}
}
}
StorageFile fileclone;
async Task<WriteableBitmap> LoadBitmap(StorageFile file)
{
int cropx = PhotoUploadCropper.CropTop;
int cropy = PhotoUploadCropper.CropLeft;
int cropW = PhotoUploadCropper.CropWidth;
int cropH = PhotoUploadCropper.CropHeight;
using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read))
{
var bmp = await BitmapFactory.New(1, 1).FromStream(fileStream);
var croppedBmp = bmp.Crop(cropy, cropx, cropW, cropH);
var resizedcroppedBmp = croppedBmp.Resize(200, 200, WriteableBitmapExtensions.Interpolation.Bilinear);
return resizedcroppedBmp;
}
}
private async void AcceptPhotoImageCropClick(object sender, RoutedEventArgs e)
{
var CroppedBMP = await CropBitmap(fileclone);
using (IRandomAccessStream fileStream = new InMemoryRandomAccessStream())
{
string filename = Path.GetRandomFileName() + ".JPG";
var file = await Windows.Storage.ApplicationData.Current.TemporaryFolder.CreateFileAsync(filename, CreationCollisionOption.GenerateUniqueName);
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
Stream pixelStream = CroppedBMP.PixelBuffer.AsStream();
byte[] pixels = new byte[pixelStream.Length];
await pixelStream.ReadAsync(pixels, 0, pixels.Length);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)CroppedBMP.PixelWidth, (uint)CroppedBMP.PixelHeight, 96.0, 96.0, pixels);
await encoder.FlushAsync();
}
ProfilePhotoButtonsGrid.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
BackgroundLogo.Visibility = Windows.UI.Xaml.Visibility.Visible;
PhotoUploadCropper.IsEnabled = false;
PhotoUploadCropper.Opacity = 0;
ProfileSetupStackPanel.Visibility = Windows.UI.Xaml.Visibility.Visible;
if (fileStream != null)
{
UploadFile(file);
}
}
}
最佳答案
您必须为此使用 WBX WinRT API。看起来您正在尝试 WP/Silverlight 方法。
试试这个:
async Task<WriteableBitmap> LoadBitmap(string path)
{
Uri imageUri = new Uri(BaseUri, path);
var bmp = await BitmapFactory.New(1, 1).FromContent(imageUri);
return bmp;
}
注意它需要一个 URI。在您的情况下,您可以直接使用 IRandomAccessStream:
var bmp = await BitmapFactory.New(1, 1).FromStream(fileStream);
关于c# - 使用用于 UI 和 WriteableBitmapEx 的 Xamlcropcontrol 裁剪图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30747008/
我正在生成一个包含 37000 个左右标记的全屏图像。为此,我使用以下代码 private void DrawMarkers(WriteableBitmap bitmap) {
我想知道是否可以在普通的 C# 控制台应用程序中使用 WriteableBitmap 类/WriteableBitmapEx 框架?我尝试通过 nuget 添加它,并且还包含一个用于 System.W
我需要组合来自两个 WriteableBitmap 对象的两个颜色值并用它们计算一些东西。因此,我在第一个对象上运行 ForEach 循环,并将其颜色值和第二个对象的颜色值解析为一个方法。 write
** 找到解决方案 由于这是一个图 block ,图像将始终被拉伸(stretch)到 173 x 173! 为避免这种情况,首先创建一个 173 x 173 的虚拟模型,并将其与调整后的模型合并!
所以我在 Windows RT 上为应用程序使用 WriteableBitmapEx。我正在尝试使用 sobel 运算符对图像进行边缘检测。我已经使用 .Convolute() 成功地将用于 x 和
我正在使用 WriteableBitmapEx用于编辑使用 Windows 8 Pro 的平板电脑摄像头拍摄的图像的库。每次调用 GetPixel() 函数时,我都会收到 AccessViolatio
我目前正在尝试使用 WriteableBitmapEx 叠加两个位图使用文档中的此方法: writeableBmp.Blit(new Point(10, 10), bitmap, sourceRect
在我的隐藏对象游戏中,我想在使用以下代码找到对象时用圆形图像标记对象,其中 AnsX1、AnsX2、AnsY1、AnsY2 是对象位置的像素坐标。圆形图片应根据像素坐标标记的对象大小调整大小
我为 winrt (win 8 metro) 下载了 WriteableBitmapEx。我用扩展方法添加了对 dll 的引用,在我的代码中使用了它们,一切都编译正常。 问题是扩展方法没有效果。这是我
在过去的一周里,我一直在尽可能多地研究如何在我的 Windows 应用商店应用程序中添加裁剪个人资料图像的功能。到目前为止,我已经查看了 Microsoft 对此的解决方案,但决定采用不同的方法。我从
我是一名优秀的程序员,十分优秀!