C# 如何在windows mobile中加载高分辨率图像

C# 如何在windows mobile中加载高分辨率图像,c#,.net,windows-mobile,C#,.net,Windows Mobile,有谁能告诉我,如何使用C#在windows mobile中加载高分辨率图像。 我从MemoryException中得到了。使用IImagingFactory和IImage,它们是WCE 5.0中引入的com对象 您必须为它们编写com包装器,或者使用已有的OpenNETCF 请参阅Chris Lorton关于alphablending和imaging factory类的博客文章,以及如何从.net使用它们。此代码显示了一个表单,在240x320的表单上有2mb jpg图像(3000x2000左右

有谁能告诉我,如何使用C#在windows mobile中加载高分辨率图像。
我从MemoryException中得到了

使用IImagingFactory和IImage,它们是WCE 5.0中引入的com对象

您必须为它们编写com包装器,或者使用已有的OpenNETCF


请参阅Chris Lorton关于alphablending和imaging factory类的博客文章,以及如何从.net使用它们。此代码显示了一个表单,在240x320的表单上有2mb jpg图像(3000x2000左右),没有任何例外。显然,您需要整理它来处理bmp和释放com对象等,但它确实有效,我已经在wm6.5模拟器上试用过

public partial class Form1 : Form
{
    IImage smallImage;
    Bitmap bmp = new Bitmap(240, 320);

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        IImage fullSizeImage;
        IImagingFactory factory = new ImagingFactoryClass();
        factory.CreateImageFromFile(@"\My Documents\My Pictures\luminous opera house.jpg", out fullSizeImage);

        fullSizeImage.GetThumbnail(240, 320, out smallImage);

        using (Graphics gfx = Graphics.FromImage(bmp))
        {
            IntPtr hdc = gfx.GetHdc();
            try
            {
                smallImage.Draw(hdc, new Rectangle(0, 0, 240, 320), IntPtr.Zero);
            }
            finally
            {
                gfx.ReleaseHdc(hdc);
            }
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawImage(bmp, 0, 0);
    }
}

这包括加载大图像,然后放大部分图像。

您可以包括您使用的代码吗?谢谢你的回复,我也在使用这个方法。。但问题是。。IntPtr hdcDest=gxBuffer.GetHdc();矩形dstRect=新矩形(左、上、右、下);imagingImage.Draw(hdcDest、ref-dstRect、IntPtr.Zero);gxBuffer.ReleaseHdc(hdcDest);e、 Graphics.DrawImage(backBuffer,0,0);我们在“imagingImage.Draw(hdcDest,ref-dstRect,IntPtr.Zero)”中获得了异常记忆;我们不会像包装位图那样使用(bitmap backBuffer=new bitmap(Width,Height,PixelFormat.Format32bppRgb)),bitmap backBuffer=new bitmap(Width,Height)PixelFormat.Format32bppRgb是否重要?感谢您的回复,我也在使用这种方法。。但问题是。。IntPtr hdcDest=gxBuffer.GetHdc();矩形dstRect=新矩形(左、上、右、下);imagingImage.Draw(hdcDest、ref-dstRect、IntPtr.Zero);gxBuffer.ReleaseHdc(hdcDest);e、 Graphics.DrawImage(backBuffer,0,0);我们在“imagingImage.Draw(hdcDest,ref-dstRect,IntPtr.Zero);”中得到了MemoryOfException;我们不会像包装位图那样,使用(bitmap backBuffer=new bitmap(Width,Height,PixelFormat.Format32bppRgb))替代,bitmap backBuffer=new bitmap(Width,Height)PixelFormat.Format32bppRgb是否重要?我不这样认为,检查你的dstRect中的大小,因为IImage希望右下角是绝对位置,而不是rect构造函数中的宽度和高度。我已经在我的WM应用程序中多次使用了你那里的代码,大多数时候我在绘图时遇到异常是在DSRECT设置不正确的时候。你要画的图像有多大?是什么格式的?谢谢你。。图像分辨率为3000X2000。我使用的是like this bitmap=新位图(宽度、高度);graphics=graphics.FromImage(位图);IntPtr hdcDest=graphics.GetHdc();矩形dstRect=新矩形(0,0,bitmap.width,bitmap.height);绘图(hdcDest,ref-dstRect,IntPtr.Zero);创建位图的宽度和高度值是多少?3000x2000?啊,我想我也有这个问题,使用一个大图像并将其大小绘制到一个小位图上,我仍然得到了OOM,但是如果使用IImage.GetThumbnail和要绘制大图像的较小位图的大小,它将为您调整大小。我使用的是opennetcf图像库,因此是ImageFactoryClass,但是我已经更改了对IImage.Draw的调用,以使用矩形和intptr,而不是RECT和null,因为我认为如果您不使用opennetcfwe没有使用“opennetcf”,fullSizeImage.GetThumbnail(240320,out smallImage);正如我看到的更大的图像像素,图像质量会下降。DrawAPI让OOMI知道您没有使用opennetcf,这就是我将调用更改为draw的原因。不管怎么说,它们只是com的包装。是的,调用缩略图将在图像缩小时对图像进行像素化。您需要在设备上进行图像大小调整吗?你不能适当地调整图片的大小并将其包含在你的应用程序中吗?我认为你应该看看这个问题和Chris Tacke的答案。也许您可以使用DIB加载大图像并进行处理以缩小它。再看看IImageDecoders,也许你需要使用一个比GetThumbnail更能调整大小的解码器。。。感谢您的回复,我们看到了,但是,如果我们这样做的话,任何其他选择或任何其他加载图像的方式看起来都不好。。