|
Вопрос # 1 849/ вопрос открыт / |
|
Здравствуйте, эксперты!В Image после захвата кадра из avi у меня поступает bmp, далее я его сжимаю до jpeg
...jpg:=TJpegImage.Create;
jpg.Assign(image1.picture.graphic);
jpg.Compress;
и его сохраняю в файл jpg.SaveToFile('D:\temp.jpg');
У меня вопрос как сохранить не 24 битный,а 16 битный jpeg и ещё со своим размером?
 |
Вопрос задал: GAZ (статус: Посетитель)
Вопрос отправлен: 27 августа 2008, 06:58
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Шичко Игорь
Здравствуйте, GAZ!
Для реализации можно использовать свойства TJPEGImage:
type TJPEGQualityRange = 1..100;
property CompressionQuaiity: TJPEGQualityRange; //степень сжатия 1...100
type TJPEGPixelFormat = (jf24Bit, jf8Bit);
property PixelFormat: TJPEGPixelForm; // формат пикселей (8 или 24 бит)
Подробнее рекомендую посетить страничку
http://kda.mpt.ru/el_doc/delphi7pro/Glava10/Index12.html
 |
Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 27 августа 2008, 08:57
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, GAZ!
Дополню Игоря.
Просто изменить размер JPG мало. Надо это делать с применением какого-нибудь алгоритма для "мягкости" и "сглаживания" изображения.
Держите пример в Приложении по изменению размера картинки JPG.
P.S. Желаю удачи.
Приложение: Переключить в обычный режим- uses
- JPEG;
-
- type
- TRGBArray = array[Word] of TRGBTriple;
- pRGBArray = ^TRGBArray;
-
-
- procedure SmoothResize(Src, Dst: TBitmap);
- var
- x, y: Integer;
- xP, yP: Integer;
- xP2, yP2: Integer;
- SrcLine1, SrcLine2: pRGBArray;
- t3: Integer;
- z, z2, iz2: Integer;
- DstLine: pRGBArray;
- DstGap: Integer;
- w1, w2, w3, w4: Integer;
- begin
- Src.PixelFormat := pf24Bit;
- Dst.PixelFormat := pf24Bit;
-
- if (Src.Width = Dst.Width) and (Src.Height = Dst.Height) then
- Dst.Assign(Src)
- else
- begin
- DstLine := Dst.ScanLine[0];
- DstGap := Integer(Dst.ScanLine[1]) - Integer(DstLine);
-
- xP2 := MulDiv(pred(Src.Width), $10000, Dst.Width);
- yP2 := MulDiv(pred(Src.Height), $10000, Dst.Height);
- yP := 0;
-
- for y := 0 to pred(Dst.Height) do
- begin
- xP := 0;
-
- SrcLine1 := Src.ScanLine[yP shr 16];
-
- if (yP shr 16 < pred(Src.Height)) then
- SrcLine2 := Src.ScanLine[succ(yP shr 16)]
- else
- SrcLine2 := Src.ScanLine[yP shr 16];
-
- z2 := succ(yP and $FFFF);
- iz2 := succ((not yp) and $FFFF);
- for x := 0 to pred(Dst.Width) do
- begin
- t3 := xP shr 16;
- z := xP and $FFFF;
- w2 := MulDiv(z, iz2, $10000);
- w1 := iz2 - w2;
- w4 := MulDiv(z, z2, $10000);
- w3 := z2 - w4;
- DstLine[x].rgbtRed := (SrcLine1[t3].rgbtRed * w1 +
- SrcLine1[t3 + 1].rgbtRed * w2 +
- SrcLine2[t3].rgbtRed * w3 + SrcLine2[t3 + 1].rgbtRed * w4) shr 16;
- DstLine[x].rgbtGreen :=
- (SrcLine1[t3].rgbtGreen * w1 + SrcLine1[t3 + 1].rgbtGreen * w2 +
-
- SrcLine2[t3].rgbtGreen * w3 + SrcLine2[t3 + 1].rgbtGreen * w4) shr 16;
- DstLine[x].rgbtBlue := (SrcLine1[t3].rgbtBlue * w1 +
- SrcLine1[t3 + 1].rgbtBlue * w2 +
- SrcLine2[t3].rgbtBlue * w3 +
- SrcLine2[t3 + 1].rgbtBlue * w4) shr 16;
- Inc(xP, xP2);
- end; {for}
- Inc(yP, yP2);
- DstLine := pRGBArray(Integer(DstLine) + DstGap);
- end; {for}
- end; {if}
- end; {SmoothResize}
-
-
- function LoadJPEGPictureFile(Bitmap: TBitmap; FilePath, FileName: string): Boolean;
- var
- JPEGImage: TJPEGImage;
- begin
- if (FileName = '') then // No FileName so nothing
- Result := False //to load - return False...
- else
- begin
- try // Start of try except
- JPEGImage := TJPEGImage.Create; // Create the JPEG image... try // now
- try // to load the file but
- JPEGImage.LoadFromFile(FilePath + FileName);
- // might fail...with an Exception.
- Bitmap.Assign(JPEGImage);
- // Assign the image to our bitmap.Result := True;
- // Got it so return True.
- finally
- JPEGImage.Free; // ...must get rid of the JPEG image. finally
- end; {try}
- except
- Result := False; // Oops...never Loaded, so return False.
- end; {try}
- end; {if}
- end; {LoadJPEGPictureFile}
-
-
- function SaveJPEGPictureFile(Bitmap: TBitmap; FilePath, FileName: string;
- Quality: Integer): Boolean;
- begin
- Result := True;
- try
- if ForceDirectories(FilePath) then
- begin
- with TJPegImage.Create do
- begin
- try
- Assign(Bitmap);
- CompressionQuality := Quality;
- SaveToFile(FilePath + FileName);
- finally
- Free;
- end; {try}
- end; {with}
- end; {if}
- except
- raise;
- Result := False;
- end; {try}
- end; {SaveJPEGPictureFile}
-
-
- procedure ResizeImage(FileName: string; MaxWidth: Integer);
- var
- OldBitmap: TBitmap;
- NewBitmap: TBitmap;
- aWidth: Integer;
- begin
- OldBitmap := TBitmap.Create;
- try
- if LoadJPEGPictureFile(OldBitmap, ExtractFilePath(FileName),
- ExtractFileName(FileName)) then
- begin
- aWidth := OldBitmap.Width;
- if (OldBitmap.Width > MaxWidth) then
- begin
- aWidth := MaxWidth;
- NewBitmap := TBitmap.Create;
- try
- NewBitmap.Width := MaxWidth;
- NewBitmap.Height := MulDiv(MaxWidth, OldBitmap.Height, OldBitmap.Width);
- SmoothResize(OldBitmap, NewBitmap);
- RenameFile(FileName, ChangeFileExt(FileName, '.$$$'));
- if SaveJPEGPictureFile(NewBitmap, ExtractFilePath(FileName),
- ExtractFileName(FileName), 75) then
- DeleteFile(ChangeFileExt(FileName, '.$$$'))
- else
- RenameFile(ChangeFileExt(FileName, '.$$$'), FileName);
- finally
- NewBitmap.Free;
- end; {try}
- end; {if}
- end; {if}
- finally
- OldBitmap.Free;
- end; {try}
- end;
-
-
- function JPEGDimensions(Filename : string; var X, Y : Word) : boolean;
- var
- SegmentPos : Integer;
- SOIcount : Integer;
- b : byte;
- begin
- Result := False;
- with TFileStream.Create(Filename, fmOpenRead or fmShareDenyNone) do
- begin
- try
- Position := 0;
- Read(X, 2);
- if (X <> $D8FF) then
- exit;
- SOIcount := 0;
- Position := 0;
- while (Position + 7 < Size) do
- begin
- Read(b, 1);
- if (b = $FF) then begin
- Read(b, 1);
- if (b = $D8) then
- inc(SOIcount);
- if (b = $DA) then
- break;
- end; {if}
- end; {while}
- if (b <> $DA) then
- exit;
- SegmentPos := -1;
- Position := 0;
- while (Position + 7 < Size) do
- begin
- Read(b, 1);
- if (b = $FF) then
- begin
- Read(b, 1);
- if (b in [$C0, $C1, $C2]) then
- begin
- SegmentPos := Position;
- dec(SOIcount);
- if (SOIcount = 0) then
- break;
- end; {if}
- end; {if}
- end; {while}
- if (SegmentPos = -1) then
- exit;
- if (Position + 7 > Size) then
- exit;
- Position := SegmentPos + 3;
- Read(Y, 2);
- Read(X, 2);
- X := Swap(X);
- Y := Swap(Y);
- Result := true;
- finally
- Free;
- end; {try}
- end; {with}
- end; {JPEGDimensions}
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 27 августа 2008, 11:40
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 28 августа 2008, 08:25; участников в обсуждении: 2.
|
GAZ (статус: Посетитель), 28 августа 2008, 07:13 [#1]:
Шичко Игорь
Эти свойства я знаю,я не знаю на каком этапе их применить,может всё таки пример напишите
|
|
Шичко Игорь (статус: 9-ый класс), 28 августа 2008, 08:25 [#2]:
To GAZ
Применять достаточно просто:
Повторюсь может немного за Feniks но попроще:
jpg:= TJPEGImage.Create;
jpg.PixelFormat:= jf8Bit; // можно jf24Bit, jf8Bit
jpg.CompressionQuality:= 50; // можно 1...100
jpg.Assign(image1.Picture.Bitmap);
jpg.Compress;
jpg.SaveToFile('c:\1.jpg');
Можете поэкспериментировать с разными значениями PixelFormat и
CompressionQuality, получаются различные размеры выходного файла.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|