Scribling Doodle Ответов: 1

Как создать миниатюру после настройки параметра для добавления изображения в базу данных SQL?


Привет,
У меня есть эта проблема с управлением таблицами, которая просто загружает клиентские данные. Но моя проблема заключается в том, что у меня есть большие изображения, которые отображаются на gridview, делая строки огромными.

Я просто хочу добавить исходное изображение в поле "фото" и измененное изображение в поле "миниатюра" в моей базе данных.

Что я уже пробовал:

У меня есть этот код, но он просто вставляет одно и то же изображение в базу данных, а не вставляет измененное. Есть идеи?


string cb = "insert into Customer(C_ID,CustomerID,Name,Address,City,ContactNo,Email,Photo,Thumbnail) VALUES (@d1,@d2,@d3,@d4,@d5,@d6,@d7,@d8,@d9)";
                cc.cmd = new SqlCommand(cb);
                cc.cmd.Connection = cc.con;
                cc.cmd.Parameters.AddWithValue("@d1", txtID.Text);
                cc.cmd.Parameters.AddWithValue("@d2", txtCustomerID.Text);
                cc.cmd.Parameters.AddWithValue("@d3",txtCustomerName.Text);
                cc.cmd.Parameters.AddWithValue("@d4", txtAddress.Text);
                cc.cmd.Parameters.AddWithValue("@d5", txtCity.Text);
                cc.cmd.Parameters.AddWithValue("@d6", txtContactNo.Text);
                cc.cmd.Parameters.AddWithValue("@d7",txtEmailID.Text);
                MemoryStream ms = new MemoryStream();
                Bitmap bmpImage = new Bitmap(Picture.Image);
                bmpImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] data = ms.GetBuffer();
                SqlParameter p = new SqlParameter("@d8", SqlDbType.Image);
                p.Value = data;
                cc.cmd.Parameters.Add(p);
                MemoryStream thumb = new MemoryStream();
                Bitmap bmpThumb = new Bitmap(Picture.Image);
                bmpImage.GetThumbnailImage(80, 80, () => false, IntPtr.Zero);
                byte[] thumbnail = thumb.GetBuffer();
                SqlParameter tp = new SqlParameter("@d9", SqlDbType.Image);
                tp.Value = thumbnail;
                cc.cmd.Parameters.Add(tp);
                cc.cmd.ExecuteReader();
                cc.con.Close();
                st1 = lblUser.Text;
                st2 = "Adicionou o cliente '" + txtCustomerName.Text + "' com o ID: '" + txtCustomerID.Text + "'";
                cf.LogFunc(st1, System.DateTime.Now, st2);
                btnSave.Enabled = false;
                MessageBox.Show("Gravado com sucesso", "Registo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

1 Ответов

Рейтинг:
8

OriginalGriff

Две вещи: во - первых, если ваши изображения большие, то лучше не хранить их в БД-используйте файл и храните путь к файлу в БД вместо этого.

Во-вторых, ваш код говорит ему хранить большое изображение дважды, потому что вы ничего не делаете с уменьшенным изображением после его создания, просто дважды добавляете буфер ms. Вам нужно сохранить новое уменьшенное изображение в thumb поток и извлечение этого буфера перед установкой значения параметра.

Ваш код также был бы немного более очевидным, если бы вы использовали "правильные" имена для параметров SQL и AddWithValue вместо Add:

string cb = "insert into Customer(C_ID,CustomerID,Name,Address,City,ContactNo,Email,Photo,Thumbnail) VALUES (@ID,@CID,@NAM,@ADDR,@CITY,@CNO,@EML,@IMAGE,@THUMB)";
cc.cmd = new SqlCommand(cb);
...
byte[] data = ms.GetBuffer();
cc.cmd.Parameters.AddWithValue("@IMAGE", data);
...
byte[] thumbnail = thumb.GetBuffer();
cc.cmd.Parameters.AddWithValue("@THUMB", thumbnail);
...


Scribling Doodle

Не совсем понял вашу вторую часть. Я новичок и на самом деле не могу найти способ решить эту проблему. Не могли бы вы быть более откровенными?

OriginalGriff

Вы написали код, чтобы получить данные изображения из изображения, да? Поэтому вам нужно сделать что-то подобное, чтобы получить данные миниатюр.

Scribling Doodle

Это то, что я сделал, фактический код действительно вставляет 2 изображения, но миниатюра на самом деле вставляется с тем же разрешением, что и обычное, а не 120x120, как я сделал в коде.

OriginalGriff

Да, потому что вы использовали один и тот же буфер данных для обоих вместо доступа к данным миниатюр после их создания.
Посмотрите на свой код: что вы делаете с уменьшенным изображением, когда вызываете GetThumbnailImage? Где вы храните само уменьшенное изображение?

Scribling Doodle

Я храню его в поле d9, которое представляет столбец миниатюр в моей базе данных. У меня есть фотоколонна и большой палец, но только большой палец должен быть во время просмотра всех данных.

OriginalGriff

Нет, не надо - в этом все дело!

Посмотрите на код.
Вы называете GetThumbnailImage. Что вы делаете с образом, который он возвращает?

Scribling Doodle

Технически я бы вставил его в базу данных. В соответствии с моими потребностями мне просто нужен эскиз, чтобы строки не были слишком большими по высоте.

OriginalGriff

"было бы" - это слово" будущего времени " здесь, а не то, что вы сделали с ним до сих пор...

Scribling Doodle

Вот почему я использовал слово "технически". Он просто должен вставить то же изображение, что и миниатюра в базу данных, чтобы оно отображалось на datagrid без какой-либо чрезмерной высоты строки.

OriginalGriff

Но ваш код этого не делает.
Он даже не использует его ... или хранить ... или сохранить ... или ссылаться на него ...

Scribling Doodle

Он вставляет байт. Но это не изменение размера. Вот в чем моя настоящая проблема.

OriginalGriff

:вздыхать:
Ладно - ты не будешь смотреть ни на свой код, ни на документы, ни на что-то еще, так что я все объясню.
GetThumbnailImage берет изображение и некоторую информацию о размере и * возвращает новое изображение*, содержащее миниатюру. Он не изменяет исходное изображение или любые буферы, созданные из него, он * возвращает новое изображение*

Который вы полностью игнорируете,и он отбрасывается...теперь в этом есть смысл?

Scribling Doodle

byte[] thumbnail = thumb.GetBuffer();
SqlParameter tp = новый SqlParameter ("@d9", SqlDbType.Изображение);
tp. Value = миниатюра;
чч.УМК.Параметры.Добавить (tp);

Что это на самом деле значит для вас? Я создаю байт и сохраняю значение из буфера. Затем я создаю параметр sql, чтобы вставить его в миниатюру столбца. После этого я просто установил значение var 'tp' на то же значение, что и Байт миниатюры. После этого я просто добавляю его в базу данных в качестве параметра. Разве не это написано в Кодексе? Как я могу не использовать значение, если это именно то, что я сделал? Значение находится в базе данных, но его размер не изменяется

OriginalGriff

И что именно находится в "большом пальце"?
Позвольте мне дать вам подсказку о том, где вы должны начать думать:

Изображение thisIsTheThumbNailImageYouJustCreatedprehapsusingitmightbeagoodidea = bmpImage.GetThumbnailImage(80, 80, () = & gt; false, IntPtr. Zero);