比如好多图四周都有黑色区域,(下面图中的黑色部分是连续的,就当作有黑边吧,而且每张图四周的黑边宽度也不确定)
■■■■■
■ ■
■ ■
■■■■■
■■■■■怎样找到应剪切区域的左上角、右下解坐标呢?提提建议也可。对了,这是因为扫描图片时操作失误引起的。目的是要把数据库里这些图的黑边都去掉。另外就是这些图都是tif格式,我本来是从数据库中读取到pictureBox里,然后用鼠标拖到白色区域后写回数据库来着,但发现写回后的大小要比原图大三、四倍。这个问题哪位高手知道的话也一并帮忙解决一下吧。不过,关键还是先解决第一步。谢谢~~~
■■■■■
■ ■
■ ■
■■■■■
■■■■■怎样找到应剪切区域的左上角、右下解坐标呢?提提建议也可。对了,这是因为扫描图片时操作失误引起的。目的是要把数据库里这些图的黑边都去掉。另外就是这些图都是tif格式,我本来是从数据库中读取到pictureBox里,然后用鼠标拖到白色区域后写回数据库来着,但发现写回后的大小要比原图大三、四倍。这个问题哪位高手知道的话也一并帮忙解决一下吧。不过,关键还是先解决第一步。谢谢~~~
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里再找到剪切坐标。
你先通过byte流创建image;
然后通过image创建graphics;
用graphics对象来进行缩进直线颜色判断。不过你如果已经把图像放到picturebox中,用手动选择区域来进行复制,效果可能要好。to 但发现写回后的大小要比原图大三、四倍
这可能是你Image.Save,没有制定文件格式。
在网上看到好多类似如下代码: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.
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只能处理黑白图像所致~