我有一个脚本组件,用于获取图像,使用c#代码将其缩小,然后尝试将byte []结果设置为列。此时我收到一个错误:
在 Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSManagedComponentWrapper100.AddBLOBData(IDTSBuffer100 pIDTSBuffer,Int32 hRow,Int32 hCol,Byte []& ppsaData)at Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer.AddBlobData(的Int32 columnIndex,Byte [] data)at ScriptMain.Input0_ProcessInputRow(Input0Buffer Row)in C:\ Users \用户e032955999 \应用程序数据\本地\ TEMP \ VSTA \ 65b7c0a9d6444e7f987741e111376505 \ main.cs:线 在UserComponent.Input0_ProcessInput(Input0Buffer Buffer)中的127 C:\ Users \用户e032955999 \应用程序数据\本地\ TEMP \ VSTA \ 65b7c0a9d6444e7f987741e111376505 \ ComponentWrapper.cs:线 36在UserComponent.ProcessInput(Int32 InputID,String InputName, PipelineBuffer Buffer,OutputNameMap OutputMap)in C:\ Users \用户e032955999 \应用程序数据\本地\ TEMP \ VSTA \ 65b7c0a9d6444e7f987741e111376505 \ ComponentWrapper.cs:线 27点 Microsoft.SqlServer.Dts.Pipeline.ScriptComponent.ProcessInput(的Int32 InputID,PipelineBuffer buffer)at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(的Int32 inputID,PipelineBuffer buffer)
代码:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
//Row.BigImage = Row.Image;
Row.FilePath = Row.Path;
byte[] arr = MakeSmallImage(Row.Image);
Row.SmallImage.ResetBlobData();
Row.BigImage.AddBlobData(arr);
Row.SmallImage.AddBlobData(arr);
}
private byte[] MakeSmallImage(Microsoft.SqlServer.Dts.Pipeline.BlobColumn blobColumn)
{
const int iSmallImageMaxSize = 15 * 1024;
const int iSmallImageMinSize = 10 * 1024;
byte[] BytePicture = blobColumn.GetBlobData(0, (int)blobColumn.Length);//Get the picture bytes from the blob.
byte[] SmallPicture = null;
if (BytePicture.Length < iSmallImageMaxSize)
{
using (MemoryStream oOriginalPictureStream = new MemoryStream(BytePicture))
{
Image oPicture;
int sourceX = 0;
int sourceY = 0;
int destX = 0;
int destY = 0;
oPicture = Image.FromStream(oOriginalPictureStream);
Size OriginalPictureSize = oPicture.Size;
int CompressedPictureBytes = BytePicture.Length;
MemoryStream oCompressedPictureStream = new MemoryStream(iSmallImageMaxSize);
Size CompressedPictureSize = OriginalPictureSize;
double Ratio = ((double)OriginalPictureSize.Width) / OriginalPictureSize.Height;
Size CompressedPictureMinSize = new Size((int)(120 * Ratio), 120);
Size CompressedPictureMaxSize = OriginalPictureSize;
int Count = 1;
do
{
oCompressedPictureStream.Position = 0;
switch (Count)
{
case 1:
Count++;
break;
case 2:
Ratio = Math.Sqrt(((double)iSmallImageMaxSize) / CompressedPictureBytes);
CompressedPictureSize.Width = (int)(CompressedPictureSize.Width * Ratio);
CompressedPictureSize.Height = (int)(CompressedPictureSize.Height * Ratio);
Count++;
break;
default:
if (iSmallImageMaxSize > CompressedPictureBytes)
{
CompressedPictureMinSize = CompressedPictureSize;
}
else
{
CompressedPictureMaxSize = CompressedPictureSize;
}
CompressedPictureSize = (CompressedPictureMaxSize - CompressedPictureMinSize);
CompressedPictureSize.Width = CompressedPictureSize.Width / 2;
CompressedPictureSize.Height = CompressedPictureSize.Height / 2;
CompressedPictureSize += CompressedPictureMinSize;
break;
}
Bitmap CompressedPicture = new Bitmap(CompressedPictureSize.Width, CompressedPictureSize.Height,
PixelFormat.Format24bppRgb);
CompressedPicture.SetResolution(Math.Min(oPicture.HorizontalResolution, 72),
Math.Min(oPicture.VerticalResolution, 72));
Graphics grPhoto = Graphics.FromImage(CompressedPicture);
grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(oPicture,
new Rectangle(destX, destY, CompressedPictureSize.Width,
CompressedPictureSize.Height),
new Rectangle(sourceX, sourceY, OriginalPictureSize.Width,
OriginalPictureSize.Height),
GraphicsUnit.Pixel);
grPhoto.Dispose();
CompressedPicture.Save(oCompressedPictureStream, System.Drawing.Imaging.ImageFormat.Jpeg);
CompressedPicture.Dispose();
CompressedPictureBytes = (int)oCompressedPictureStream.Position;
oCompressedPictureStream.SetLength(CompressedPictureBytes);
} while (((CompressedPictureMaxSize - CompressedPictureMinSize).Width > 50) &&
((CompressedPictureBytes > iSmallImageMaxSize) ||
(CompressedPictureBytes < iSmallImageMinSize)));
oPicture.Dispose();
//SmallPicture = new byte[oCompressedPictureStream.Length];
SmallPicture = oCompressedPictureStream.ToArray();
oCompressedPictureStream.Dispose();
}
//oDAL.UploadFileToDatabase(SmallPicture, BytePicture, lTmunaID);
}
return SmallPicture;
}
答案 0 :(得分:1)
也许是因为null
?当BytePicture.Length < iSmallImageMaxSize
条件为假时,MakeSmallImage
方法将返回null
BlobColumn
类具有SetNull
方法,因此您应该使用它来清空blob。