[Moonlight-list] Res: Help with WriteableBitmap
Tony Alexander Hild
tony_hild at yahoo.com
Wed Jul 22 20:55:06 EDT 2009
Bug report filled
#524458Tony
>
>
>>
>>De: Geoff Norton <gnorton at novell.com>
>>Para: Tony Alexander Hild <tony_hild at yahoo.com>
>>Cc: Moonlight List <moonlight-list at lists.ximian.com>
>>Enviadas: Quarta-feira, 22 de Julho de 2009 15:12:53
>>Assunto: Re:
>> [Moonlight-list] Res: Help with WriteableBitmap
>>
>>Tony,
>>
>>
>> There is likely a bug in my code setting PixelWidth and PixelHeight from existing images since I havn't udpated to the RTM code yet. Can you file a bug with a testcase showing the problems you're having?
>>
>>
>>Thanks
>>
>>
>>-g
>>
>>
>>On 21-Jul-09, at 5:44 PM, Tony Alexander Hild wrote:
>>
>>Hi,
>>>
>>>The path is right. The image is rendering because is marked as resource.
>>>
>>>What I'm trying to do is change this image with WriteableBitmap. The SL 3 RTM have breaking changes, and Moonligth WriteableBitmap is compatible with SL Beta. In SL Beta version was not allowed to write in an image that was already rendered, but now is possible. The acess to pixels was changed from an indexer to a property that returns an array int[], and now it's not possible to acess the pixel through Marshal.ReadInt32 since we don't know the offset. I tried to using the Marshal.Copy but I get an Security Access error.
>>>
>>>I don't know how cast from IntPtr (buffer) directly to an int[].
>>>
>>>Another issue is that the BitmapSource return 0 from the PixelWidth and PixelHeight properties. I started digging the C++ code to figure out how the things works.
>>>
>>>Tony
>>>
>>>>
>>>>De: Diego Frata <diego.frata at gmail.com>
>>>>Para: Tony Alexander Hild <tony_hild at yahoo.com>
>>>>Enviadas: Terça-feira, 21 de Julho de 2009 18:07:18
>>>>Assunto: Re: [Moonlight-list] Help with WriteableBitmap
>>>>
>>>>Hello,
>>>>
>>>>I have some experience with WriteableBitmap and BitmapSource on WPF (not on Mono). Maybe I could help you with this implementation.
>>>>
>>>>I was looking at your code and it raised me a question: Can you confirm your instance of BitmapSource points to a valid file? The path you entered doesn't sound right to me Source="/test;component/2.png".
>>>>
>>>>The image control is rendering the image correctly?
>>>>
>>>>Sorry if it's a dumb question, but I'll try to look at the source code later (i'm at work right now).
>>>>
>>>>Diego Frata
>>>>diego.frata at gmail.com
>>>>
>>>>
>>>>
>>>>On Tue, Jul 21, 2009 at 3:33 PM, Tony Alexander Hild <tony_hild at yahoo.com> wrote:
>>>>
>>>>Hi,
>>>>>
>>>>>I have made a simple program to test the WriteableBitmap.
>>>>>btnTest_Click calls the Invert function.
>>>>>
>>>>>
>>>>> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>>>>> Width="1000" Height="650"
>>>>> x:Class="HelloMoon.Page"
>>>>>>
>>>>> <Grid x:Name="LayoutRoot" Background="Black">
>>>>> <TextBlock x:Name="tblText" FontSize="30" Foreground="White">Hello Moon!</TextBlock>
>>>>> <Button x:Name="btnTest" Width="200" VerticalAlignment="Top" Height="50" Canvas.Top="0" Canvas.Left="100" Click="btnTest_Click" Content="Click me!"></Button>
>>>>> <Image x:Name="MyBitmap" Source="/test;component/2.png"
>>>>> Width="512"
>>>>> Height="512"
>>>>> />
>>>>>
>>>>> </Grid>
>>>>></UserControl>
>>>>>
>>>>> private void Invert ()
>>>>> {
>>>>> const int imageWidth = 512;
>>>>> const int imageHeight = 512;
>>>>>
>>>>> WriteableBitmap b = new WriteableBitmap ((BitmapSource)MyBitmap.Source);
>>>>> //WriteableBitmap b = new WriteableBitmap (imageWidth, imageHeight, PixelFormats.Bgr32);
>>>>>
>>>>> for (int x = 0; x < imageWidth; x++) {
>>>>> for (int y = 0; y < imageHeight; y++) {
>>>>>
>>>>> int color = b.Pixels[y * imageWidth + x];
>>>>> if (color == 0) {
>>>>> // generate a color in Pbgra32 format
>>>>> byte[] components = {
>>>>> 255,
>>>>> 255,
>>>>> 255,
>>>>>
>>>>> 0
>>>>> };
>>>>> int pixelValue = BitConverter.ToInt32 (components, 0);
>>>>> b.Pixels[y * imageWidth + x] = pixelValue;
>>>>>
>>>>> } else {
>>>>> b.Pixels[y * imageWidth + x] = b.Pixels[y * imageWidth + x] = 0;
>>>>> }
>>>>>
>>>>> }
>>>>> }
>>>>>
>>>>> b.Invalidate ();
>>>>> MyBitmap.Source = b;
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>>I also modified the constructor of WriteableBitmap:
>>>>>
>>>>> public WriteableBitmap (BitmapSource source) : base(NativeMethods.writeable_bitmap_new (), true)
>>>>> {
>>>>> rendered = true;
>>>>> PixelWidth = source.PixelWidth;
>>>>> PixelHeight = source.PixelHeight;
>>>>> PixelFormat = PixelFormats.Pbgra32;
>>>>>
>>>>> if (source != null)
>>>>> NativeMethods.writeable_bitmap_initialize_from_bitmap_source (native, source.native);
>>>>> }
>>>>>
>>>>>But source.PixelWidth/Height always is 0, so i get this error:
>>>>>
>>>>>
>>>>>Value must be greater than zeroException Details: System.ArgumentException: Value must be greater than zero
>>>>>
>>>>>Stack Trace:
>>>>>
>>>>>
>>>>> at Mono..NativeMethods.CreateManagedException (MoonError err) [0x00000]
>>>>>
>>>>>
>>>>> at Mono.NativeMethods..dependency_object_set_value (IntPtr instance, IntPtr property, Mono.Value& value) [0x00000]
>>>>> at Mono.NativeDependencyObjectHelper.SetValue (INativeDependencyObjectWrapper wrapper, System.Windows.DependencyProperty dp, System.Object value) [0x00000]
>>>>>
>>>>>
>>>>> at System.Windows.DependencyObject.SetValueImpl (System.Windows.DependencyProperty dp, System.Object value) [0x00000]
>>>>> at System.Windows.DependencyObject.SetValue (System.Windows.DependencyProperty dp, System.Object value) [0x00000]
>>>>>
>>>>>
>>>>> at System.Windows.Media.Imaging.BitmapSource.set_PixelWidth (Int32 value) [0x00000]
>>>>> at
>>>>> System.Windows.Media.Imaging.WriteableBitmap..ctor (System.Windows..Media.Imaging.BitmapSource source) [0x00000]
>>>>> at HelloMoon.Page.Invert () [0x00000]
>>>>> at HelloMoon.Page.btnTest_Click (System.Object sender, System.Windows.RoutedEventArgs e) [0x00000]
>>>>>
>>>>>
>>>>> at System.Windows.Controls.Primitives.ButtonBase.OnClick () [0x00000]
>>>>> at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp (System.Windows.Input.MouseButtonEventArgs e) [0x00000]
>>>>> at System.Windows..Controls.Control.InvokeMouseLeftButtonUp (System.Windows.Input.MouseButtonEventArgs e) [0x00000]
>>>>>
>>>>>
>>>>> at Mono.Events.mouse_left_button_up_callback (IntPtr target, IntPtr calldata, IntPtr closure) [0x00000]
>>>>> at Mono.Events+<CreateSafeHandler>c__AnonStorey1.<>m__2 (IntPtr a, IntPtr b, IntPtr c) [0x00000]
>>>>>But as the BitmapSource is already rendered, it should have the Height and Width properties set.
>>>>>
>>>>>What I'm doing wrong?
>>>>>I'm using trunk version, from mono, mcs, libgdi and moon.
>>>>>
>>>>>
>>>>>Tony
>>>>>
>>>>>
>>>>>________________________________
Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 - Celebridades - Música - Esportes
>>>>>_______________________________________________
>>>>>Moonlight-list mailing list
>>>>>Moonlight-list at lists.ximian.com
>>>>>http://lists.ximian.com/mailman/listinfo/moonlight-list
>>>>>
>>>>>
>>>>
>>>________________________________
Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 - Celebridades - Música - Esportes_______________________________________________
>>>Moonlight-list mailing list
>>>Moonlight-list at lists.ximian.com
>>>http://lists.ximian.com/mailman/listinfo/moonlight-list
>>>
>>
>________________________________
Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 - Celebridades - Música - Esportes
____________________________________________________________________________________
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/moonlight-list/attachments/20090722/c29e7c04/attachment-0001.html
More information about the Moonlight-list
mailing list