Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Сжатие картинки jpeg при помещении ее в базу   Найти похожие ветки 

 
pavel_guzhanov ©   (2005-05-30 09:29) [0]

Суть вопроса в следующем. База находится на удаленном сервере, с него изображения грузятся на форму. На форме можно выбрать изображение для помещения его в отчет. Но на форму грузятся все изображения, и это иногда очень замедляет процесс загрузки формы.
В базе (не моей, я просто пишу программу для работы с уже существующей базой) кроме поля "Изображение", в котором хранится полная картинка, имеется еще поле "Эскиз", куда и помещается то же изображение, но в уменьшенном объеме, с более низким качеством картинки. Брать я из этого поля изображение могу, а вот помещать туда новые не могу, т. к. не знаю, как их сжать перед помещением в базу. Подскажите пожалуйста, как это сделать?


 
pavel_guzhanov ©   (2005-05-30 09:29) [1]

заархивировать картинку не пройдет, так как тип поля - image


 
Anatoly Podgoretsky ©   (2005-05-30 09:47) [2]

На сервере нужно сделать расширенную хранимую процедуру или добавить еще одно поле.


 
Val ©   (2005-05-30 10:03) [3]

проблема в том, как сделать картинку с более низким качеством, или как поместить картинку в базу?


 
pavel_guzhanov ©   (2005-05-30 10:08) [4]

Поместить в базу - не проблема, проблема именно в уменьшении объема...


 
Fay ©   (2005-05-30 10:08) [5]

pavel_guzhanov ©   (30.05.05 9:29) [1]
> заархивировать картинку не пройдет, так как тип поля -
> image

Можно поподорбнее ?


 
Val ©   (2005-05-30 10:19) [6]

повторяю: уменьшение объема в данном случае = сохранение в базу с более низким разрешением?


 
dmitry501 ©   (2005-05-30 10:21) [7]

pavel_guzhanov ©   (30.05.05 9:29)
const
FThumbSize = 150;

//Speed up by Renate Schaaf, Armido, Gary Williams...
procedure MakeThumbNail(src, dest: tBitmap);
type
 PRGB24 = ^TRGB24;
 TRGB24 = packed record
   B: Byte;
   G: Byte;
   R: Byte;
 end;
var
 x, y, ix, iy: integer;
 x1, x2, x3: integer;

 xscale, yscale: single;
 iRed, iGrn, iBlu, iRatio: Longword;
 p, c1, c2, c3, c4, c5: tRGB24;
 pt, pt1: pRGB24;
 iSrc, iDst, s1: integer;
 i, j, r, g, b, tmpY: integer;

 RowDest, RowSource, RowSourceStart: integer;
 w, h: integer;
 dxmin, dymin: integer;
 ny1, ny2, ny3: integer;
 dx, dy: integer;
 lutX, lutY: array of integer;

begin
 if src.PixelFormat <> pf24bit then src.PixelFormat := pf24bit;
 if dest.PixelFormat <> pf24bit then dest.PixelFormat := pf24bit;
 w := Dest.Width;
 h := Dest.Height;

 if (src.Width <= FThumbSize) and (src.Height <= FThumbSize) then
 begin
   dest.Assign(src);
   exit;
 end;

 iDst := (w * 24 + 31) and not 31;
 iDst := iDst div 8; //BytesPerScanline
 iSrc := (Src.Width * 24 + 31) and not 31;
 iSrc := iSrc div 8;

 xscale := 1 / (w / src.Width);
 yscale := 1 / (h / src.Height);

 // X lookup table
 SetLength(lutX, w);
 x1 := 0;
 x2 := trunc(xscale);
 for x := 0 to w - 1 do
 begin
   lutX[x] := x2 - x1;
   x1 := x2;
   x2 := trunc((x + 2) * xscale);
 end;

 // Y lookup table
 SetLength(lutY, h);
 x1 := 0;
 x2 := trunc(yscale);
 for x := 0 to h - 1 do
 begin
   lutY[x] := x2 - x1;
   x1 := x2;
   x2 := trunc((x + 2) * yscale);
 end;

 dec(w);
 dec(h);
 RowDest := integer(Dest.Scanline[0]);
 RowSourceStart := integer(Src.Scanline[0]);
 RowSource := RowSourceStart;
 for y := 0 to h do
 begin
   dy := lutY[y];
   x1 := 0;
   x3 := 0;
   for x := 0 to w do
   begin
     dx:= lutX[x];
     iRed:= 0;
     iGrn:= 0;
     iBlu:= 0;
     RowSource := RowSourceStart;
     for iy := 1 to dy do
     begin
       pt := PRGB24(RowSource + x1);
       for ix := 1 to dx do
       begin
         iRed := iRed + pt.R;
         iGrn := iGrn + pt.G;
         iBlu := iBlu + pt.B;
         inc(pt);
       end;
       RowSource := RowSource - iSrc;
     end;
     iRatio := 65535 div (dx * dy);
     pt1 := PRGB24(RowDest + x3);
     pt1.R := (iRed * iRatio) shr 16;
     pt1.G := (iGrn * iRatio) shr 16;
     pt1.B := (iBlu * iRatio) shr 16;
     x1 := x1 + 3 * dx;
     inc(x3,3);
   end;
   RowDest := RowDest - iDst;
   RowSourceStart := RowSource;
 end;

 if dest.Height < 3 then exit;

 // Sharpening...
 s1 := integer(dest.ScanLine[0]);
 iDst := integer(dest.ScanLine[1]) - s1;
 ny1 := Integer(s1);
 ny2 := ny1 + iDst;
 ny3 := ny2 + iDst;
 for y := 1 to dest.Height - 2 do
 begin
   for x := 0 to dest.Width - 3 do
   begin
     x1 := x * 3;
     x2 := x1 + 3;
     x3 := x1 + 6;

     c1 := pRGB24(ny1 + x1)^;
     c2 := pRGB24(ny1 + x3)^;
     c3 := pRGB24(ny2 + x2)^;
     c4 := pRGB24(ny3 + x1)^;
     c5 := pRGB24(ny3 + x3)^;

     r := (c1.R + c2.R + (c3.R * -12) + c4.R + c5.R) div -8;
     g := (c1.G + c2.G + (c3.G * -12) + c4.G + c5.G) div -8;
     b := (c1.B + c2.B + (c3.B * -12) + c4.B + c5.B) div -8;

     if r < 0 then r := 0 else if r > 255 then r := 255;
     if g < 0 then g := 0 else if g > 255 then g := 255;
     if b < 0 then b := 0 else if b > 255 then b := 255;

     pt1 := pRGB24(ny2 + x2);
     pt1.R := r;
     pt1.G := g;
     pt1.B := b;
   end;
   inc(ny1, iDst);
   inc(ny2, iDst);
   inc(ny3, iDst);
 end;
end;


Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php


 
pavel_guzhanov ©   (2005-05-30 10:24) [8]

Fay
в MS Enterprise Manager в Design Table - Data Type - image, length - 16


 
pavel_guzhanov ©   (2005-05-30 10:32) [9]

Val [6]
Возможно и такое, хотя я предполагал, что на компьютере, откуда грузится картинка, должно создаваться изображение с меньшим объемом, а потом загружаиться в базу. А Вы предлагаете уменьшать объем в процессе загрузки в базу?


 
Val ©   (2005-05-30 10:37) [10]

Я пока что не предлагаю ничего. Я хочу узнать что для вас создает проблему, поэтому задаю контрвопросы. Мне несколько непонятна ваша задача. Что вы хотите сделать и что не получается?


 
pavel_guzhanov ©   (2005-05-30 10:47) [11]

Val [10]

Я хочу имеющийся файл перед загрузкой в базу уменьшить и загрузить в базу уменьшенный. Проблема состоит именно в уменьшении размера файла, т.к. я просто не знаю, как это сделать....


 
Val ©   (2005-05-30 10:56) [12]

Тогда просто перед сохранением в  "изображение" и "эскиз" указываете соотв. сжатие  с помощью TJPEGImage.CompressionQuality, например.


 
Anatoly Podgoretsky ©   (2005-05-30 11:04) [13]

pavel_guzhanov ©   (30.05.05 10:32) [9]
Возможно и такое, хотя я предполагал, что на компьютере, откуда грузится картинка, должно создаваться изображение с меньшим объемом, а потом загружаиться в базу. А Вы предлагаете уменьшать объем в процессе загрузки в базу?

А в чем различие?
Может ты просто своими, простыми словами объясничщь, что ты хочешь сделать. Примерно так

Имею то то.
Должно получиться то то.
Хочу сделать это таким то методом и там то.


 
pavel_guzhanov ©   (2005-05-30 11:42) [14]

Всем спасибо. Час назад скачал классный фак по Delphi, весит почти 10 мегов, и в нем нашел решение своей проблемы, причем несколько вариантов. Один из них использовал, работает:-))



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.065 c
14-1118043518
Андрей Жук
2005-06-06 11:38
2005.07.11
Никто не подскажет, чему соответствует __leave в Borland C++?


3-1117566158
Сергей Яковлев
2005-05-31 23:02
2005.07.11
Подгонка ширины столбцов DBGrid


9-1111794303
Octree
2005-03-26 02:45
2005.07.11
[GLScene] Кто нибудь использовал Octree для больших карт ?


1-1119343980
wrmj
2005-06-21 12:53
2005.07.11
Соответствие типов Pascal DOS и Delphi 5


1-1118756542
olevacho
2005-06-14 17:42
2005.07.11
Как сделать приложение сервисом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский