BitmapSource ConvertTo Bitmap

偶遇需要把 BitmapSource 转成 Bitmap。 。。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows;
using System.Windows.Media.Imaging;

namespace Jisons
{
    public static class BitmapSourceHelper
    {

        public static Bitmap ConvertToBitmap(this BitmapSource bs)
        {
            return ConvertToBitmap(bs, 0, 0, bs.PixelWidth, bs.PixelHeight);
        }

        public static Bitmap ConvertToBitmap(this BitmapSource bs, int x, int y, int width, int height)
        {
            var bmp = new Bitmap(width, height, PixelFormat.Format32bppPArgb);
            var bmpdata = bmp.LockBits(new Rectangle(System.Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb);
            bs.CopyPixels(new Int32Rect(x, y, width, height), bmpdata.Scan0, bmpdata.Height * bmpdata.Stride, bmpdata.Stride);
            bmp.UnlockBits(bmpdata);
            return bmp;
        }

        public static byte[] ConvertToBytes(this BitmapSource bs)
        {
            return ConvertToBytes(bs, 0, 0, (int)bs.Width, (int)bs.Height);
        }

        public static byte[] ConvertToBytes(this BitmapSource bs, int x, int y, int width, int height)
        {
            var rect = new Int32Rect(x, y, width, height);
            var stride = bs.Format.BitsPerPixel * rect.Width / 8;
            byte[] data = new byte[rect.Height * stride];
            bs.CopyPixels(rect, data, stride, 0);
            return data;
        }

        public static BitmapSource ClipBitmapSource(this BitmapSource bs, int x, int y, int width, int height)
        {
            var rect = new Int32Rect(x, y, width, height);
            var stride = bs.Format.BitsPerPixel * rect.Width / 8;
            byte[] data = new byte[rect.Height * stride];
            bs.CopyPixels(rect, data, stride, 0);
            return BitmapSource.Create(width, height, 0, 0, System.Windows.Media.PixelFormats.Bgra32, null, data, stride);
        }

        public static Bitmap ConvertToBitmap(this byte[] data, int width, int height)
        {
            var bmp = new Bitmap(width, height);
            for (int w = 0; w < width; w++)
            {
                for (int h = 0; h < height; h++)
                {
                    int index = h * width * 4 + w * 4;

                    int B = data[index];
                    int G = data[index + 1];
                    int R = data[index + 2];
                    int A = data[index + 3];

                    bmp.SetPixel(w, h, System.Drawing.Color.FromArgb(A, R, G, B));
                }
            }
            return bmp;
        }

        public static BitmapSource ConvertToBitmapSource(this Bitmap source)
        {
            return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(source.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        }

    }
}

时间: 2024-10-09 09:35:01

BitmapSource ConvertTo Bitmap的相关文章

C# Bitmap转化为BitmapImage方法

public BitmapImage BitmapToBitmapImage(Bitmap bitmap) { Bitmap bitmapSource = new Bitmap(bitmap.Width,bitmap.Height); int i,j; for(i=0;i<bitmap.Width;i++) for (j = 0; j < bitmap.Height; j++) { Color pixelColor = bitmap.GetPixel(i, j); Color newColor

C#中Image , Bitmap 和 BitmapData

先说Image,Image 就是个图像,不能实例化,提供了位图和源文件操作的函数.本篇文章他就是来打酱油的,这里提供一个Bitmap转成BitmapSource的方法. 1 [DllImport("gdi32")] 2 static extern int DeleteObject(IntPtr o); 3 /// <summary> 4 /// bitmap转换为bitmapsource 以适应wpf的image 5 /// </summary> 6 /// &

WPF(C#)中Bitmap与BitmapImage相互转换

一.WPF的Image控件中设置ImageSource image1.Source = new BitmapImage(new Uri(@"image file path", Urikind.RelativeOrAbsolute)); 还可以使用: System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read); byte[]

WPF 引用DLL纯图像资源包类库中的图片

1.建立WPF应用程序 过程略. 2.创建类库项目(图片资源包) 创建图片资源类库项目MyImages,删除class1.cs,在项目属性的资源选项中选择“图像”类型,并在“添加资源”中点击“添加现有的文件”,把图像加入到资源.并把访问修饰符改为Public. 3.在WPF应用程序中引用类库项目 在WPF中通过 MyImages.Properties.Resources.XXX即可访问图像.XXX为图像文件名(资源名称).但在WPF中的到图像还需一下工作. 4.WPF中创建Rectangle或其

线程理解(一)

Thread 目录: 1 线程基础的简单介绍 2 线程同步与线程异步的简单介绍 3 前台线程与后台线程的简单介绍 4 细说下Thread 最为关键的构造函数 5 细说下Thread 的 Sleep方法 6 细说下Thread 的 join 方法 7 细说下Thread 的 Abort和 Interrupt方法 8 细说下Thread 的 Suspend,Resume方法 9 简单了解下Thread 的 一些重要属性 10  简单示例 多线程从一个图片中截取部分图片 11 本章总结 1 线程基础的

WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表

原文:WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表 一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要针对WPF项目开发中图片的各种使用问题,经过总结,把一些经验分享一下.内容包括: WPF常用图像数据源ImageSource的创建: 自定义缩略图控件ThumbnailImage,支持网络图片.大图片.图片异步加载

[CSharp]6 文件属性以及资源文件的使用

一.C#文件属性 1.什么是文件属性 文件属性可以用来指示项目系统对应文件执行的操作.具体的操作见下文.Visual Basic和Visual C#的文件都具有4个属性:“FileName".“BuildAcition”.“CustomTool”.”CustomToolNamespace“. 2.CopyToOutputDirectory属性 此属性指定将选定的源文件复制到输出目录所依据的条件.如果从不将文件复制到输出目录,请选择“不复制”:如果总是将文件复制到输出目录,请选择“始终复制”:如果

线程篇(一)

c# 温故而知新: 线程篇(一) Thread 目录: 目录: 1 线程基础的简单介绍 2 线程同步与线程异步的简单介绍 3 前台线程与后台线程的简单介绍 4 细说下Thread 最为关键的构造函数 5 细说下Thread 的 Sleep方法 6 细说下Thread 的 join 方法 7 细说下Thread 的 Abort和 Interrupt方法 8 细说下Thread 的 Suspend,Resume方法 9 简单了解下Thread 的 一些重要属性 10  简单示例 多线程从一个图片中截

文件属性及资源文件的使用

一.C#文件属性 1.什么是文件属性 文件属性可以用来指示项目系统对应文件执行的操作.具体的操作见下文.Visual Basic和Visual C#的文件都具有4个属性:"FileName"."BuildAcition"."CustomTool"."CustomToolNamespace". 2.CopyToOutputDirectory属性 此属性指定将选定的源文件复制到输出目录所依据的条件.如果从不将文件复制到输出目录,请