比如好多图四周都有黑色区域,(下面图中的黑色部分是连续的,就当作有黑边吧,而且每张图四周的黑边宽度也不确定)
■■■■■
■      ■
■      ■
■■■■■
■■■■■怎样找到应剪切区域的左上角、右下解坐标呢?提提建议也可。对了,这是因为扫描图片时操作失误引起的。目的是要把数据库里这些图的黑边都去掉。另外就是这些图都是tif格式,我本来是从数据库中读取到pictureBox里,然后用鼠标拖到白色区域后写回数据库来着,但发现写回后的大小要比原图大三、四倍。这个问题哪位高手知道的话也一并帮忙解决一下吧。不过,关键还是先解决第一步。谢谢~~~

解决方案 »

  1.   

    图是一个数据库中的字节流。可以通过类似
    byte[] buffByte = null;cmd.CommandText = "select IMAGE from TABLE where ***";while (datareader.Read())
    {
         buffByte = ((byte[])rd[0]);
    }System.IO.MemoryStream ms = new System.IO.MemoryStream(buffByte);
    //通过流对象建立Bitmap
    System.Drawing.Bitmap bmp = new Bitmap(ms);然后怎么做?图为大约3000*2000左右的大图,又不同显示在pictureBox里再找到剪切坐标。
      

  2.   

    如果只是处理黑边的话,还是比较容易的,比较简单的算法就是
    你先通过byte流创建image;
    然后通过image创建graphics;
    用graphics对象来进行缩进直线颜色判断。不过你如果已经把图像放到picturebox中,用手动选择区域来进行复制,效果可能要好。to 但发现写回后的大小要比原图大三、四倍
    这可能是你Image.Save,没有制定文件格式。
      

  3.   

    to:Knight94(愚翁) 
    在网上看到好多类似如下代码:private static ImageCodecInfo GetEncoderInfo(string mimeType)
    {
                int j;
                ImageCodecInfo[] encoders;            encoders = ImageCodecInfo.GetImageDecoders();
                for (j = 0; j < encoders.Length; j++)
                {
                    if (encoders[j].MimeType == mimeType)
                        return encoders[j];
                }
                return null;
    }
    ...ImageCodecInfo icf = GetEncoderInfo("image/tiff");System.Drawing.Imaging.Encoder myEncoder;
    EncoderParameter myEncoderParameter;
    EncoderParameters myEncoderParameters;myEncoder = System.Drawing.Imaging.Encoder.Compression;
                    
    myEncoderParameters = new EncoderParameters(1);
    myEncoderParameter = new EncoderParameter(myEncoder, (long)EncoderValue.CompressionLZW);
    myEncoderParameters.Param[0] = myEncoderParameter;
                    
    image.Save("c:\\newx.tif",icf, myEncoderParameters);我对tiff格式没什么了解,只是知道用ACDSee压缩时,选CCITT4时最好。对应程序里的EncoderValue.CompressionCCITT4,不过别的参数还好,只要选定这个就提示参数错误。
    ----
    再次说明一下情况:一个从数据库里读出来写进硬盘的图为69KB左右,把其中部分区域剪切后写进同样大小的图后Save,有时居然>1MB。这个问题对我很重要,因为数据库有80多万条这样的图片需要处理,而每一张的大小处理后变成原来十倍左右,那可不是什么好玩的事啊!一定帮到底啊,这不是学习,而是和业务有关的,急需处理的问题哦。thank you, again.
      

  4.   

    to EncoderValue.CompressionCCITT4,不过别的参数还好,只要选定这个就提示参数错误。具体报什么错误
      

  5.   

    如果原图是1bpp(1 bit per pixel)的,cmd.CommandText = "select IMAGE from TABLE where ...";
    cmd.Connection = conn;conn.Open();
    byte[] buffByte = null;OracleDataReader rd = cmd.ExecuteReader();
    while (rd.Read())
    {
        buffByte = ((byte[])rd[0]);
    }
    rd.Close();
    conn.Close();System.IO.MemoryStream ms = new System.IO.MemoryStream(buffByte);
    //通过流对象建立Bitmap
    System.Drawing.Bitmap bmp = new Bitmap(ms);Image img = bmp;MessageBox.Show(img.PixelFormat.ToString()); // 输出:Format1bppIndexed//但,如果你这样
    Bitmap bmpx = new Bitmap(img);
    MessageBox.Show(bmpx.PixelFormat.ToString()); // 输出:Format32bppArgb应该是CCITT4只能处理黑白图像所致~