j c

j c

  • NA
  • 45
  • 0

Read multiple images from database

Jan 12 2006 10:23 AM

I am trying to read image ( binary data type) directly from database. I can read if the image is single ,but if there are multiple images put together( inside one column) , I am not be able to read it. I am getting an error when try to debug:

System.ArgumentOutOfRangeException was unhandled by user code
Message="Index and count must refer to a location within the buffer.\r\nParameter name: bytes"
Source="mscorlib"
ParamName="bytes"
StackTrace:
at System.Text.ASCIIEncoding.GetString(Byte[] bytes, Int32 byteIndex, Int32 byteCount)
at GetImage.Page_Load(Object sender, EventArgs e) in c:\Documents and Settings\jc\My Documents\Visual Studio 2005\WebSites\CashApp\Cash\GetImage.aspx.cs:line 50
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Can you take a look at below code and let me know what I am doing wrong?

there are columns called FrontImageOffset, FrontImageSize that tells me where an image's byte stream ends and a new image begins
so, I am using a sql command like below to figure out what I am supposed to looking for..

sql = "select FrontImageOffset, FrontImageSize from CDData where TransactionId=" + TransactionId;
using (SqlCommand cmd = new SqlCommand(sql, cn))



Below is code that I am using it.

using
System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Drawing;

using System.Data.SqlClient;

using System.IO;

using System.Drawing.Imaging;

using System.Collections.Generic;

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

{

protected void Page_Load(object sender, EventArgs e)

{

const int oleOffset = 78;

const int oleTypeStart = 20;

const int oleTypeLength = 12;

string TransactionId;

string sql;

Bitmap bmp;

byte[] imageBytes;

TransactionId = (string)this.Request.QueryString["TransactionId"];

if (TransactionId == null) return;

TransactionId = int.Parse(TransactionId).ToString();

sql = "Select Image from IDXImage where TransactionId=" + TransactionId;

ConnectionStringSettings cnSetting =

ConfigurationManager.ConnectionStrings["CashAppConnectionString6"];

using (SqlConnection cn = new SqlConnection(cnSetting.ConnectionString))

{

using (SqlCommand cmd = new SqlCommand(sql, cn))

{

cn.Open();

using (SqlDataReader dr = cmd.ExecuteReader())

{

dr.Read();

imageBytes = (byte[])dr.GetValue(0);

}

}

}

if (imageBytes == null || imageBytes.Length == 0) return;

MemoryStream tempStream;

string type = System.Text.Encoding.ASCII.GetString(

imageBytes, oleTypeStart, oleTypeLength);

if (type == "Bitmap Image")

{

tempStream = new MemoryStream(

imageBytes, oleOffset, imageBytes.Length - oleOffset);

}

else

{

tempStream = new MemoryStream(

imageBytes, 0, imageBytes.Length);

}

bmp = new Bitmap(tempStream);

// bmp = new Bitmap(bmp, bmp.Height / 3 , bmp.Width / 2);

Response.ContentType = "Image/gif";

bmp.Save(Response.OutputStream, ImageFormat.Gif);

Response.End();

 

}

 

 

private void _GetMultipleImages ()

{

const int oleOffset = 78;

const int oleTypeStart = 20;

const int oleTypeLength = 12;

string TransactionId;

string sql;

byte[] imageBytes;

TransactionId = (string)this.Request.QueryString["TransactionId"];

if (TransactionId == null) return;

TransactionId = int.Parse(TransactionId).ToString();

sql = "Select Image from IDXImage where TransactionId=" + TransactionId;

ConnectionStringSettings cnSetting =

ConfigurationManager.ConnectionStrings["CashAppConnectionString6"];

using (SqlConnection cn = new SqlConnection(cnSetting.ConnectionString))

{

using (SqlCommand cmd = new SqlCommand(sql, cn))

{

cn.Open();

using (SqlDataReader dr = cmd.ExecuteReader())

{

dr.Read();

imageBytes = (byte[])dr["Image"];

}

}

}

if (imageBytes == null || imageBytes.Length == 0) return;

ArrayList imgList = new ArrayList();

using (SqlConnection cn = new SqlConnection(cnSetting.ConnectionString))

{

sql = "select FrontImageOffset, FrontImageSize from IDXCDData where TransactionId=" + TransactionId;

using (SqlCommand cmd = new SqlCommand(sql, cn))

{

cn.Open();

using (SqlDataReader dr = cmd.ExecuteReader())

{

if (dr.HasRows)

{

if (dr.Read())

{

//

// Make a static copy of the buffer information

//

long imagebytesLen = imageBytes.Length;

List<Byte> imgBytes = new List<byte>(imageBytes);

do

{

long offset = (long)dr["FrontImageOffset"];

long length = (long)dr["FrontImageSize"];

//

// Determine if we have enough buffer to read the bytes

//

if (imagebytesLen >= (offset + length))

{

//

// allocate a new buffer for our image and then

// make a copy of it from our image buffer.

//

byte[] newimage = new byte[length];

imgBytes.CopyTo(Convert.ToInt32 (offset), newimage, 0, newimage.Length);

//

// Now add us to our list

//

imgList.Add(newimage);

}

} while (dr.NextResult());

}

}

dr.Close();

}

}

}

//

// Do we have any images?

//

if (imgList.Count > 0)

{

//

// Loop through the list and concatenate all the images

// into one huge image.

//

List<byte> bigImage = new List<byte>();

for (int i = 0; i < imgList.Count; ++i)

{

bigImage.AddRange((byte[])imgList[i]);

}

//

// Create hte bitmap from the buffered data

//

byte[] data = bigImage.ToArray();

MemoryStream tempStream = new MemoryStream(imageBytes);

tempStream.Position = 0;

System.Drawing.Image bmp = System.Drawing.Image.FromStream(tempStream);

// bmp = new Bitmap(bmp, bmp.Height / 3 , bmp.Width / 2);

Response.ContentType = "Image/gif";

bmp.Save(Response.OutputStream, ImageFormat.Gif);

Response.End();

}

}

}