2014-01-06 15:45:23 xujianping32 阅读数 23
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13599 人正在学习 去看看 张建飞
  最近在处理一个图片需求时,碰到了一个小问题。由于图片是通过字节数组从C#传到java的,而C#的byte是没有符号位的,从0到255,java的则有符号位的,从-128~127。这样在从c#传递到java的时候,就会出现字节大小过长的问题。
  在此之间,曾想过用截取或者运算的方法获取,均以失败告终。最后,转念一想,其实对于机器而言,既然C#和java的byte都是8位,而且都是二进制的,那么不管他们的十进制在c#和java里的值是多少,只要他们的8位二进制一样,实际上这两个数字是一致的。
  这样一想,问题就简单多了。为了保障能正确接收C#传过来的字节数组,我用int数组接收。成功接收后,我再把int数组强制转化为byte数组,就大功告成了。虽然强制转化会丢失精度,但是实际上我们也只要int的前8位(也就是从c#接收的byte)就可以了。这样接收后,就成功把将C#生成的图片二进制转化成java的图片二进制了,最后,再将二进制转化成图片就可以了。附上转化为图片较为粗略的代码:

public static String byteToImage(byte[] byte1)
{
String fileName = System.currentTimeMillis()+ ".jpg";
try {
File filePic = new File(“E://”+fileName);
if(!filePic.getParentFile().isDirectory()){
(new File(filePic.getParent())).mkdirs();
}
FileOutputStream fos =new FileOutputStream(filePic);
fos.write(byte1);
fos.flush();
fos.close();

} catch (IOException e) {
e.printStackTrace();
}
return fileName;
}

  
2019-12-10 22:08:07 zxy13826134783 阅读数 12
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13599 人正在学习 去看看 张建飞

网上看到的很多文章介绍转成python图片对象的都是通过读取图片文件转换而来,但是并不是所有的业务逻辑都能通过读取图片文件的,如我的客户端使用C#语言动态拍摄图片并传到服务端给python处理,这样服务端的python就不能通过以读取图片的方式创建图片对象了(平时都是使用C#开发,python不是很熟悉,可能有些描述不是很到位,勿喷)

 

我想要实现的大概的业务流程是:

客户端(C#或者使用其它语言)把图片转成字节数组,并把字节数组转成Base64String的字符串,通过rpc(C#的可以参考我前面写的文章:https://blog.csdn.net/zxy13826134783/article/details/102977028)技术发送字符串给python处理,你可能会有疑惑,为什么字节数组要转成Base64String的字符串,直接传递字节数组岂不是更好?我尝试过了,不能直接传递字节数组,可能是语言之间的不兼容

 

至于使用C#把图片转成字节数组,并把字节数组转成Base64String的字符串的步骤就省略了,本文通过python的方式读取图片文件并转成Base64String的字符串进行模拟客户端产生Base64String的字符串

 

全部代码如下:

#下面哪些库没有安装的需要自己安装一下,我使用anaconda安装的python,所以我不用额外手动装库
import base64
import matplotlib.pyplot as plt
import io
import os
from PIL import Image          

#  读取图片函数,filePath是图片的路径,模拟客户端的代码
def ReadImage(filePath):
    f=open(filePath,"rb")
    #根据图片文件的大小定义字节数组
    buf=bytearray(os.path.getsize(filePath))
    #把读入的数据填充到数组中
    f.readinto(buf)
    f.flush()
    f.close()
    return buf



#显示图片,输入参数img_b64encode为字节数组编码过的编码字符串,你可以通过其它语言通过rpc远程的方式进行调用并传入base64的字符串
def ShowImage(img_b64encode):
 
    #把已经编码的字符串转成解码的字符串
    img_base64=base64.b64decode(img_b64encode)
    img=io.BytesIO(img_base64)
    #把img对象转成图像类型的对象imgage,到了这里,你可以随便折腾它了
    image=Image.open(img)
    #显示图片,这一步仅仅是为了测试是否成功地把自己编码字符串转成图像类型的对象
    plt.imshow(image)

#主程序入口   
if __name__=="__main__":
    buf=ReadImage("./TestData/test.png")
    #字节数组编码成编码字符串
    img_b64encode = base64.b64encode(buf)
    #这一步你可以通过rpc远程调用,上两步都是为了准备数据
    ShowImage(img_b64encode)

运行结果如下:

 

2017-05-02 09:15:18 zuoyefeng1990 阅读数 806
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13599 人正在学习 去看看 张建飞
using System;
using System.IO;
using System.Web;
using System.Web.UI.HtmlControls;
using System.Drawing;

namespace DotNet.Utilities
{
    /// <summary>
    /// 文件类型
    /// </summary>
    public enum FileExtension
    {
        JPG = 255216,
        GIF = 7173,
        BMP = 6677,
        PNG = 13780,
        RAR = 8297,
        jpg = 255216,
        exe = 7790,
        xml = 6063,
        html = 6033,
        aspx = 239187,
        cs = 117115,
        js = 119105,
        txt = 210187,
        sql = 255254
    }

    /// <summary>
    /// 图片检测类
    /// </summary>
    public static class FileValidation
    {
        #region 上传图片检测类
        /// <summary>
        /// 是否允许
        /// </summary>
        public static bool IsAllowedExtension(HttpPostedFile oFile, FileExtension[] fileEx)
        {
            int fileLen = oFile.ContentLength;
            byte[] imgArray = new byte[fileLen];
            oFile.InputStream.Read(imgArray, 0, fileLen);
            MemoryStream ms = new MemoryStream(imgArray);
            System.IO.BinaryReader br = new System.IO.BinaryReader(ms);
            string fileclass = "";
            byte buffer;
            try
            {
                buffer = br.ReadByte();
                fileclass = buffer.ToString();
                buffer = br.ReadByte();
                fileclass += buffer.ToString();
            }
            catch { }
            br.Close();
            ms.Close();
            foreach (FileExtension fe in fileEx)
            {
                if (Int32.Parse(fileclass) == (int)fe) return true;
            }
            return false;
        }

        /// <summary>
        /// 上传前的图片是否可靠
        /// </summary>
        public static bool IsSecureUploadPhoto(HttpPostedFile oFile)
        {
            bool isPhoto = false;
            string fileExtension = System.IO.Path.GetExtension(oFile.FileName).ToLower();
            string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (fileExtension == allowedExtensions[i])
                {
                    isPhoto = true;
                    break;
                }
            }
            if (!isPhoto)
            {
                return true;
            }
            FileExtension[] fe = { FileExtension.BMP, FileExtension.GIF, FileExtension.JPG, FileExtension.PNG };

            if (IsAllowedExtension(oFile, fe))
                return true;
            else
                return false;
        }

        /// <summary>
        /// 上传后的图片是否安全
        /// </summary>
        /// <param name="photoFile">物理地址</param>
        public static bool IsSecureUpfilePhoto(string photoFile)
        {
            bool isPhoto = false;
            string Img = "Yes";
            string fileExtension = System.IO.Path.GetExtension(photoFile).ToLower();
            string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (fileExtension == allowedExtensions[i])
                {
                    isPhoto = true;
                    break;
                }
            }

            if (!isPhoto)
            {
                return true;
            }
            StreamReader sr = new StreamReader(photoFile, System.Text.Encoding.Default);
            string strContent = sr.ReadToEnd();
            sr.Close();
            string str = "request|<script|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language=";
            foreach (string s in str.Split('|'))
            {
                if (strContent.ToLower().IndexOf(s) != -1)
                {
                    File.Delete(photoFile);
                    Img = "No";
                    break;
                }
            }
            return (Img == "Yes");
        }
        #endregion
    }

    /// <summary>
    /// 图片上传类
    /// </summary>
    //----------------调用-------------------
    //imageUpload iu = new imageUpload();
    //iu.AddText = "";
    //iu.CopyIamgePath = "";
    //iu.DrawString_x = ;
    //iu.DrawString_y = ;
    //iu.DrawStyle = ;
    //iu.Font = "";
    //iu.FontSize = ;
    //iu.FormFile = File1;
    //iu.IsCreateImg =;
    //iu.IsDraw = ;
    //iu.OutFileName = "";
    //iu.OutThumbFileName = "";
    //iu.SavePath = @"~/image/";
    //iu.SaveType = ;
    //iu.sHeight  = ;
    //iu.sWidth   = ;
    //iu.Upload();
    //--------------------------------------
    public class ImageUpload
    {
        #region 私有成员
        private int _Error = 0;//返回上传状态。 
        private int _MaxSize = 1024 * 1024;//最大单个上传文件 (默认)
        private string _FileType = "jpg;gif;bmp;png";//所支持的上传类型用"/"隔开 
        private string _SavePath = System.Web.HttpContext.Current.Server.MapPath(".") + "\\";//保存文件的实际路径 
        private int _SaveType = 0;//上传文件的类型,0代表自动生成文件名 
        private HtmlInputFile _FormFile;//上传控件。 
        private string _InFileName = "";//非自动生成文件名设置。 
        private string _OutFileName = "";//输出文件名。 
        private bool _IsCreateImg = true;//是否生成缩略图。 
        private bool _Iss = false;//是否有缩略图生成.
        private int _Height = 0;//获取上传图片的高度 
        private int _Width = 0;//获取上传图片的宽度 
        private int _sHeight = 120;//设置生成缩略图的高度 
        private int _sWidth = 120;//设置生成缩略图的宽度
        private bool _IsDraw = false;//设置是否加水印
        private int _DrawStyle = 0;//设置加水印的方式0:文字水印模式,1:图片水印模式,2:不加
        private int _DrawString_x = 10;//绘制文本的X坐标(左上角)
        private int _DrawString_y = 10;//绘制文本的Y坐标(左上角)
        private string _AddText = "GlobalNatureCrafts";//设置水印内容
        private string _Font = "宋体";//设置水印字体
        private int _FontSize = 12;//设置水印字大小
        private int _FileSize = 0;//获取已经上传文件的大小
        private string _CopyIamgePath = System.Web.HttpContext.Current.Server.MapPath(".") + "/images/5dm_new.jpg";//图片水印模式下的覆盖图片的实际地址
        #endregion

        #region 公有属性
        /// <summary>
        /// Error返回值
        /// 1、没有上传的文件
        /// 2、类型不允许
        /// 3、大小超限
        /// 4、未知错误
        /// 0、上传成功。 
        /// </summary>
        public int Error
        {
            get { return _Error; }
        }

        /// <summary>
        /// 最大单个上传文件
        /// </summary>
        public int MaxSize
        {
            set { _MaxSize = value; }
        }

        /// <summary>
        /// 所支持的上传类型用";"隔开 
        /// </summary>
        public string FileType
        {
            set { _FileType = value; }
        }

        /// <summary>
        /// 保存文件的实际路径 
        /// </summary>
        public string SavePath
        {
            set { _SavePath = System.Web.HttpContext.Current.Server.MapPath(value); }
            get { return _SavePath; }
        }

        /// <summary>
        /// 上传文件的类型,0代表自动生成文件名
        /// </summary>
        public int SaveType
        {
            set { _SaveType = value; }
        }

        /// <summary>
        /// 上传控件
        /// </summary>
        public HtmlInputFile FormFile
        {
            set { _FormFile = value; }
        }

        /// <summary>
        /// 非自动生成文件名设置。
        /// </summary>
        public string InFileName
        {
            set { _InFileName = value; }
        }

        /// <summary>
        /// 输出文件名
        /// </summary>
        public string OutFileName
        {
            get { return _OutFileName; }
            set { _OutFileName = value; }
        }

        /// <summary>
        /// 输出的缩略图文件名
        /// </summary>
        public string OutThumbFileName
        {
            get;
            set;
        }

        /// <summary>
        /// 是否有缩略图生成.
        /// </summary>
        public bool Iss
        {
            get { return _Iss; }
        }

        /// <summary>
        /// 获取上传图片的宽度
        /// </summary>
        public int Width
        {
            get { return _Width; }
        }

        /// <summary>
        /// 获取上传图片的高度
        /// </summary>
        public int Height
        {
            get { return _Height; }
        }

        /// <summary>
        /// 设置缩略图的宽度
        /// </summary>
        public int sWidth
        {
            get { return _sWidth; }
            set { _sWidth = value; }
        }

        /// <summary>
        /// 设置缩略图的高度
        /// </summary>
        public int sHeight
        {
            get { return _sHeight; }
            set { _sHeight = value; }
        }

        /// <summary>
        /// 是否生成缩略图
        /// </summary>
        public bool IsCreateImg
        {
            get { return _IsCreateImg; }
            set { _IsCreateImg = value; }
        }

        /// <summary>
        /// 是否加水印
        /// </summary>
        public bool IsDraw
        {
            get { return _IsDraw; }
            set { _IsDraw = value; }
        }

        /// <summary>
        /// 设置加水印的方式
        /// 0:文字水印模式
        /// 1:图片水印模式
        /// 2:不加
        /// </summary>
        public int DrawStyle
        {
            get { return _DrawStyle; }
            set { _DrawStyle = value; }
        }

        /// <summary>
        /// 绘制文本的X坐标(左上角)
        /// </summary>
        public int DrawString_x
        {
            get { return _DrawString_x; }
            set { _DrawString_x = value; }
        }

        /// <summary>
        /// 绘制文本的Y坐标(左上角)
        /// </summary>
        public int DrawString_y
        {
            get { return _DrawString_y; }
            set { _DrawString_y = value; }
        }

        /// <summary>
        /// 设置文字水印内容
        /// </summary>
        public string AddText
        {
            get { return _AddText; }
            set { _AddText = value; }
        }

        /// <summary>
        /// 设置文字水印字体
        /// </summary>
        public string Font
        {
            get { return _Font; }
            set { _Font = value; }
        }

        /// <summary>
        /// 设置文字水印字的大小
        /// </summary>
        public int FontSize
        {
            get { return _FontSize; }
            set { _FontSize = value; }
        }

        /// <summary>
        /// 文件大小
        /// </summary>
        public int FileSize
        {
            get { return _FileSize; }
            set { _FileSize = value; }
        }

        /// <summary>
        /// 图片水印模式下的覆盖图片的实际地址
        /// </summary>
        public string CopyIamgePath
        {
            set { _CopyIamgePath = System.Web.HttpContext.Current.Server.MapPath(value); }
        }

        #endregion

        #region 私有方法
        /// <summary>
        /// 获取文件的后缀名 
        /// </summary>
        private string GetExt(string path)
        {
            return Path.GetExtension(path);
        }

        /// <summary>
        /// 获取输出文件的文件名
        /// </summary>
        private string FileName(string Ext)
        {
            if (_SaveType == 0 || _InFileName.Trim() == "")
                return DateTime.Now.ToString("yyyyMMddHHmmssfff") + Ext;
            else
                return _InFileName;
        }

        /// <summary>
        /// 检查上传的文件的类型,是否允许上传。
        /// </summary>
        private bool IsUpload(string Ext)
        {
            Ext = Ext.Replace(".", "");
            bool b = false;
            string[] arrFileType = _FileType.Split(';');
            foreach (string str in arrFileType)
            {
                if (str.ToLower() == Ext.ToLower())
                {
                    b = true;
                    break;
                }
            }
            return b;
        }
        #endregion

        #region 上传图片
        public void Upload()
        {
            HttpPostedFile hpFile = _FormFile.PostedFile;
            if (hpFile == null || hpFile.FileName.Trim() == "")
            {
                _Error = 1;
                return;
            }
            string Ext = GetExt(hpFile.FileName);
            if (!IsUpload(Ext))
            {
                _Error = 2;
                return;
            }
            int iLen = hpFile.ContentLength;
            if (iLen > _MaxSize)
            {
                _Error = 3;
                return;
            }
            try
            {
                if (!Directory.Exists(_SavePath)) Directory.CreateDirectory(_SavePath);
                byte[] bData = new byte[iLen];
                hpFile.InputStream.Read(bData, 0, iLen);
                string FName;
                FName = FileName(Ext);
                string TempFile = "";
                if (_IsDraw)
                {
                    TempFile = FName.Split('.').GetValue(0).ToString() + "_temp." + FName.Split('.').GetValue(1).ToString();
                }
                else
                {
                    TempFile = FName;
                }
                FileStream newFile = new FileStream(_SavePath + TempFile, FileMode.Create);
                newFile.Write(bData, 0, bData.Length);
                newFile.Flush();
                int _FileSizeTemp = hpFile.ContentLength;

                string ImageFilePath = _SavePath + FName;
                if (_IsDraw)
                {
                    if (_DrawStyle == 0)
                    {
                        System.Drawing.Image Img1 = System.Drawing.Image.FromStream(newFile);
                        Graphics g = Graphics.FromImage(Img1);
                        g.DrawImage(Img1, 100, 100, Img1.Width, Img1.Height);
                        Font f = new Font(_Font, _FontSize);
                        Brush b = new SolidBrush(Color.Red);
                        string addtext = _AddText;
                        g.DrawString(addtext, f, b, _DrawString_x, _DrawString_y);
                        g.Dispose();
                        Img1.Save(ImageFilePath);
                        Img1.Dispose();
                    }
                    else
                    {
                        System.Drawing.Image image = System.Drawing.Image.FromStream(newFile);
                        System.Drawing.Image copyImage = System.Drawing.Image.FromFile(_CopyIamgePath);
                        Graphics g = Graphics.FromImage(image);
                        g.DrawImage(copyImage, new Rectangle(image.Width - copyImage.Width - 5, image.Height - copyImage.Height - 5, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
                        g.Dispose();
                        image.Save(ImageFilePath);
                        image.Dispose();
                    }
                }

                //获取图片的高度和宽度
                System.Drawing.Image Img = System.Drawing.Image.FromStream(newFile);
                _Width = Img.Width;
                _Height = Img.Height;

                //生成缩略图部分 
                if (_IsCreateImg)
                {
                    #region 缩略图大小只设置了最大范围,并不是实际大小
                    float realbili = (float)_Width / (float)_Height;
                    float wishbili = (float)_sWidth / (float)_sHeight;

                    //实际图比缩略图最大尺寸更宽矮,以宽为准
                    if (realbili > wishbili)
                    {
                        _sHeight = (int)((float)_sWidth / realbili);
                    }
                    //实际图比缩略图最大尺寸更高长,以高为准
                    else
                    {
                        _sWidth = (int)((float)_sHeight * realbili);
                    }
                    #endregion

                    this.OutThumbFileName = FName.Split('.').GetValue(0).ToString() + "_s." + FName.Split('.').GetValue(1).ToString();
                    string ImgFilePath = _SavePath + this.OutThumbFileName;

                    System.Drawing.Image newImg = Img.GetThumbnailImage(_sWidth, _sHeight, null, System.IntPtr.Zero);
                    newImg.Save(ImgFilePath);
                    newImg.Dispose();
                    _Iss = true;
                }

                if (_IsDraw)
                {
                    if (File.Exists(_SavePath + FName.Split('.').GetValue(0).ToString() + "_temp." + FName.Split('.').GetValue(1).ToString()))
                    {
                        newFile.Dispose();
                        File.Delete(_SavePath + FName.Split('.').GetValue(0).ToString() + "_temp." + FName.Split('.').GetValue(1).ToString());
                    }
                }
                newFile.Close();
                newFile.Dispose();
                _OutFileName = FName;
                _FileSize = _FileSizeTemp;
                _Error = 0;
                return;
            }
            catch (Exception ex)
            {
                _Error = 4;
                return;
            }
        }
        #endregion
    }
}

2008-07-07 19:56:00 bfcady 阅读数 4919
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13599 人正在学习 去看看 张建飞

思路:建立流对象,将上传图片临时保存到byte数组中,再用SQL语句将其保存到数据库中

说明:以下程序一切从简,实际用应用中应注意使用try等语句

  • 创建表ImageStore,表结构如下图

  • 主页面HTML如下
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>图片上传</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:FileUpload ID="fuImage" runat="server" />

    </div>

    <div>

        <asp:Button ID="btnUpload" runat="server" Text="上传图片" OnClick="btnUpload_Click" />

    </div>

    <div>

        输入图片的ID:<asp:TextBox ID="txtImageID" runat="server"></asp:TextBox>

    </div>

    <div>

        <asp:Button ID="btnSubmit" runat="server" Text="显示图片" 

            onclick="btnSubmit_Click" />

    </div>

    <div>

        <asp:Image ID="Image1" runat="server" />

    </div>

    </form>

</body>

</html>
  • 主页面后台代码
using System;

using System.Configuration;

using System.Data;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.IO;

using System.Data.SqlClient;



public partial class _Default : System.Web.UI.Page 

{

    protected void Page_Load(object sender, EventArgs e)

    {



    }

    protected void btnUpload_Click(object sender, EventArgs e)

    {

        int imageLength = fuImage.PostedFile.ContentLength;//取得图片大小,以字节为单位

        byte[] imageByteArray = new byte[imageLength];  //图片将临时存储在Byte(二进制)数组

        Stream imageStream = fuImage.PostedFile.InputStream;//建立流对象

        imageStream.Read(imageByteArray, 0, imageLength);//将图片读取到imageByteArray数组中,其中0为起始位置,imageLength为要读取的长度

        //以下为数据库连接

        SqlConnection sqlconn = new SqlConnection("server=(local);database=a0522183734;uid=a0522183734;pwd=bfcady");

        string sql = "insert imageStore(ImageData,ImageContentType,ImageDescription,ImageSize) values(@Image,@ContentType,@ImageDescription, @ImageSize)";

        SqlCommand sqlcom = new SqlCommand(sql, sqlconn);

        sqlcom.Parameters.AddWithValue("@Image", imageByteArray);

        sqlcom.Parameters.AddWithValue("@ContentType", Path.GetExtension(fuImage.PostedFile.FileName));//取得文件扩展名

        //取得文件名,不包含扩展名,实际应用中作为图片描述用

        sqlcom.Parameters.AddWithValue("@ImageDescription", Path.GetFileNameWithoutExtension(fuImage.PostedFile.FileName));

        sqlcom.Parameters.AddWithValue("@ImageSize", imageLength);

        sqlconn.Open();

        sqlcom.ExecuteNonQuery();

        sqlconn.Close();

    }

    protected void btnSubmit_Click(object sender, EventArgs e)

    {

        //改变图片的URL

        Image1.ImageUrl = "ReadImage.ashx?imgID=" + txtImageID.Text;

    }

}
  • 创建一般处理程序ReadImage.ashx,读取图片
 
  • <%@ WebHandler Language="C#" Class="ReadImage" %>
    
    
    
    using System;
    
    using System.Web;
    
    using System.Data.SqlClient;
    
    
    
    public class ReadImage : IHttpHandler {
    
        
    
        public void ProcessRequest (HttpContext context) {
    
            string imgID = context.Request.QueryString["imgID"].ToString();
    
            SqlConnection sqlconn = new SqlConnection("server=(local);database=a0522183734;uid=a0522183734;pwd=bfcady");
    
            string sql = "select * from ImageStore where ImageID=" + imgID;
    
            SqlCommand sqlcom = new SqlCommand(sql, sqlconn);
    
            sqlconn.Open();
    
            SqlDataReader sqldr = sqlcom.ExecuteReader();
    
            if (sqldr.Read())//移到第一条记录,如果第一条记录不为空
    
            {
    
                context.Response.ContentType = (string)sqldr["ImageContentType"];//设置输出类型
    
                context.Response.OutputStream.Write((byte[])sqldr["ImageData"], 0, (int)sqldr["ImageSize"]);
    
                context.Response.End();
    
            }
    
            sqlconn.Close();
    
        }
    
     
    
        public bool IsReusable {
    
            get {
    
                return false;
    
            }
    
        }
    
    }
  • 运行结果如下

2016-05-25 12:41:48 for_cxc 阅读数 834
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13599 人正在学习 去看看 张建飞

原文链接:http://www.jb51.net/article/33622.htm   脚本之家

为了娱乐写了个截取图片和压缩图片你的小工具:按照百分比压缩/制定大小压缩等等,感兴趣的朋友可以了解下啊,希望本文对你学些c#图片知识有所帮助

前端时间朋友要传一些图片给我,全是大图,考虑到网速的限制,让他处理下图片大小再给我,这厮居然不知道用什么工具.

为了娱乐写了个截取图片和压缩图片你的小工具 
1.按照百分比截图 

复制代码代码如下:

View Code 
/// <summary> 
/// 按照比例缩小图片 
/// </summary> 
/// <param name="srcImage">要缩小的图片</param> 
/// <param name="percent">缩小比例</param> 
/// <returns>缩小后的结果</returns> 
public static Bitmap PercentImage(Image srcImage, double percent) 

// 缩小后的高度 
int newH = int.Parse(Math.Round(srcImage.Height * percent).ToString()); 
// 缩小后的宽度 
int newW = int.Parse(Math.Round(srcImage.Width * percent).ToString()); 
try 

// 要保存到的图片 
Bitmap b = new Bitmap(newW, newH); 
Graphics g = Graphics.FromImage(b); 
// 插值算法的质量 
g.InterpolationMode = InterpolationMode.Default; 
g.DrawImage(srcImage, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, srcImage.Width, srcImage.Height), GraphicsUnit.Pixel); 
g.Dispose(); 
return b; 

catch (Exception) 

return null; 



2.按照指定像素大小截图 
复制代码代码如下:

View Code 
/// <summary> 
/// 按照指定大小缩放图片 
/// </summary> 
/// <param name="srcImage"></param> 
/// <param name="iWidth"></param> 
/// <param name="iHeight"></param> 
/// <returns></returns> 
public static Bitmap SizeImage(Image srcImage, int iWidth, int iHeight) 

try 

// 要保存到的图片 
Bitmap b = new Bitmap(iWidth, iHeight); 
Graphics g = Graphics.FromImage(b); 
// 插值算法的质量 
g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
g.DrawImage(srcImage, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(0, 0, srcImage.Width, srcImage.Height), GraphicsUnit.Pixel); 
g.Dispose(); 
return b; 

catch (Exception) 

return null; 



3.按照指定像素大小截图(但为了保证图片的原始比例,将对图片从中心进行截取,达到图片不被拉伸的效果) 
复制代码代码如下:

View Code 
/// <summary> 
/// 按照指定大小缩放图片,但是为了保证图片宽高比自动截取 
/// </summary> 
/// <param name="srcImage"></param> 
/// <param name="iWidth"></param> 
/// <param name="iHeight"></param> 
/// <returns></returns> 
public static Bitmap SizeImageWithOldPercent(Image srcImage, int iWidth, int iHeight) 

try 

// 要截取图片的宽度(临时图片) 
int newW = srcImage.Width; 
// 要截取图片的高度(临时图片) 
int newH = srcImage.Height; 
// 截取开始横坐标(临时图片) 
int newX = 0; 
// 截取开始纵坐标(临时图片) 
int newY = 0; 
// 截取比例(临时图片) 
double whPercent = 1; 
whPercent = ((double)iWidth / (double)iHeight) * ((double)srcImage.Height / (double)srcImage.Width); 
if (whPercent > 1) 

// 当前图片宽度对于要截取比例过大时 
newW = int.Parse(Math.Round(srcImage.Width / whPercent).ToString()); 

else if (whPercent < 1) 

// 当前图片高度对于要截取比例过大时 
newH = int.Parse(Math.Round(srcImage.Height * whPercent).ToString()); 

if (newW != srcImage.Width) 

// 宽度有变化时,调整开始截取的横坐标 
newX = Math.Abs(int.Parse(Math.Round(((double)srcImage.Width - newW) / 2).ToString())); 

else if (newH == srcImage.Height) 

// 高度有变化时,调整开始截取的纵坐标 
newY = Math.Abs(int.Parse(Math.Round(((double)srcImage.Height - (double)newH) / 2).ToString())); 

// 取得符合比例的临时文件 
Bitmap cutedImage = CutImage(srcImage, newX, newY, newW, newH); 
// 保存到的文件 
Bitmap b = new Bitmap(iWidth, iHeight); 
Graphics g = Graphics.FromImage(b); 
// 插值算法的质量 
g.InterpolationMode = InterpolationMode.Default; 
g.DrawImage(cutedImage, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(0, 0, cutedImage.Width, cutedImage.Height), GraphicsUnit.Pixel); 
g.Dispose(); 
return b; 

catch (Exception) 

return null; 



4.jpeg图片质量压缩,压缩的比例参数在1-100之间。(适量的压缩对于肉眼来说没有什么明显的区别,但是能够大大的减小图片的占用大小) 
复制代码代码如下:

View Code 
/// <summary> 
/// jpeg图片压缩 
/// </summary> 
/// <param name="sFile"></param> 
/// <param name="outPath"></param> 
/// <param name="flag"></param> 
/// <returns></returns> 
public static bool GetPicThumbnail(string sFile, string outPath, int flag) 

System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile); 
ImageFormat tFormat = iSource.RawFormat; 
//以下代码为保存图片时,设置压缩质量 
EncoderParameters ep = new EncoderParameters(); 
long[] qy = new long[1]; 
qy[0] = flag;//设置压缩的比例1-100 
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy); 
ep.Param[0] = eParam; 
try 

ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders(); 
ImageCodecInfo jpegICIinfo = null; 
for (int x = 0; x < arrayICI.Length; x++) 

if (arrayICI[x].FormatDescription.Equals("JPEG")) 

jpegICIinfo = arrayICI[x]; 
break; 


if (jpegICIinfo != null) 

iSource.Save(outPath, jpegICIinfo, ep);//dFile是压缩后的新路径 

else 

iSource.Save(outPath, tFormat); 

return true; 

catch 

return false; 

finally 

iSource.Dispose(); 
iSource.Dispose(); 



PS:之上用的CutImage方法的补充 
复制代码代码如下:

View Code 
/// <summary> 
/// 剪裁 -- 用GDI+ 
/// </summary> 
/// <param name="b">原始Bitmap</param> 
/// <param name="StartX">开始坐标X</param> 
/// <param name="StartY">开始坐标Y</param> 
/// <param name="iWidth">宽度</param> 
/// <param name="iHeight">高度</param> 
/// <returns>剪裁后的Bitmap</returns> 
public static Bitmap CutImage(Image b, int StartX, int StartY, int iWidth, int iHeight) 

if (b == null) 

return null; 

int w = b.Width; 
int h = b.Height; 
if (StartX >= w || StartY >= h) 

// 开始截取坐标过大时,结束处理 
return null; 

if (StartX + iWidth > w) 

// 宽度过大时只截取到最大大小 
iWidth = w - StartX; 

if (StartY + iHeight > h) 

// 高度过大时只截取到最大大小 
iHeight = h - StartY; 

try 

Bitmap bmpOut = new Bitmap(iWidth, iHeight); 
Graphics g = Graphics.FromImage(bmpOut); 
g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel); 
g.Dispose(); 
return bmpOut; 

catch 

return null; 



再次记录下截取的代码,虽然简单,如果重写还是需要花费时间。

C# 上传图片

阅读数 395

没有更多推荐了,返回首页