Форум: "Media";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизМасштабирование изображения Найти похожие ветки
← →
mobila (2006-05-03 18:16) [0]Мастера программирования подскажите: вот мини программа которая позволяет отмасштабировать изображение, но есть небольшая проблема при уменьшении изображение теряет своё качество (т.е. становится более чётким и чуть-чуть неровным )
Я сравнивал изображение полученное этой программой и фотошопом, у фотошопа при уменьшение изображение получается гладким .
Подскажите что нужно изменить что бы было как в фотошопе.
Вот мая софтина (программа для нарезания картинок на мобильники)
http://siemensx.metroland.ru/modules/mydownloads/visit.php?lid=137
procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBItmap;
jpg: TJpegImage;
scale: Double;
begin
if opendialog1.execute then
begin
jpg := TJpegImage.Create;
try
jpg.Loadfromfile( opendialog1.filename );
if jpg.Height > jpg.Width then
scale := 50 / jpg.Height
else
scale := 50 / jpg.Width;
bmp:= Tbitmap.Create;
try
{Create thumbnail bitmap, keep pictures aspect ratio}
bmp.Width := Round( jpg.Width * scale );
bmp.Height:= Round( jpg.Height * scale );
bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
{Draw thumbnail as control}
Self.Canvas.Draw( 100, 10, bmp );
{Convert back to JPEG and save to file}
jpg.Assign( bmp );
jpg.SaveToFile(ChangeFileext( opendialog1.filename, "_thumb.JPG" ));
finally
bmp.free;
end;
finally
jpg.free;
end;
end;
end;
← →
Sambrook © (2006-05-04 18:42) [1]Перед строкой
bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
вставьте
SetStretchBltMode(bmp.canvas.handle, newMode),
где newMode= ColorOnColor или HalfTone.
Подробности в справке.
← →
mobila (2006-05-05 20:55) [2]Я сделал всё так как вы сказали перед строкой
bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg ); вставил сначало
SetStretchBltMode(bmp.canvas.handle, ColorOnColor); а
потом не увидев результатов попробывал
SetStretchBltMode(bmp.canvas.handle, HalfTone);
но не одна не вторая строчка не пренесла результатов.
Может кроме этого ещё что то надо вставить. Очень нужно довести программу до ума подскажите пожалуйста!!!
← →
Мефисто (2006-05-05 21:01) [3]Ищи готовые решения по ключевому слову Stretch. Дельфевая StretchDraw реализована не лучшим способом. поэтому следует искать альтернативные решения. Также рекомендуется к прочтению книга Фень Юань "Программирование графики в windows"
← →
mobila (2006-05-06 11:58) [4]Эта книга для программирования на C/C++
http://irazin.ru/Downloads/Books/Yuan.rar
← →
Jeer © (2006-05-06 13:07) [5]mobila (06.05.06 11:58) [4]
Спасибо за информацию, но как это связано с сабжем на Delphi ?
← →
Мефисто (2006-05-06 15:02) [6]Jeer © (06.05.06 13:07) [5]
Есть алгоритм, а язык программирования уже значения не имеет :)
Темболее до изложения кода автор книги еще все и разжовывает как это работает и от куда чего берется ;)
← →
Sapersky (2006-05-06 15:11) [7]"Альтернативное" решение называется StretchBlt (WinAPI).
Т.к. Canvas.StretchDraw устанавливает StretchBltMode по своему усмотрению.
← →
Jeer © (2006-05-06 15:13) [8]Мефисто (06.05.06 15:02) [6]
> а язык программирования уже значения не имеет :)
Не у всех это с рождения:)
← →
mobila (2006-05-07 20:58) [9]Парни лучшеб вы мне помогли а не вели рассуждения я пишу только на делфи. Дайти кто нибудь рабочий алгоритм. Или исходник с ним.
← →
Мефисто (2006-05-07 21:59) [10]SetStretchBltMode()
Sets the bitmap-stretching mode for the StretchBlt member function.
int SetStretchBltMode(
int nStretchMode
);
Parameters
nStretchMode
Specifies the stretching mode. It can be any of the following values: Value Description
BLACKONWHITE Performs a Boolean AND operation using the color values for the eliminated and existing pixels. If the bitmap is a monochrome bitmap, this mode preserves black pixels at the expense of white pixels.
COLORONCOLOR Deletes the pixels. This mode deletes all eliminated lines of pixels without trying to preserve their information.
HALFTONE Maps pixels from the source rectangle into blocks of pixels in the destination rectangle. The average color over the destination block of pixels approximates the color of the source pixels.
After setting the HALFTONE stretching mode, an application must call the Win32 function SetBrushOrgEx to set the brush origin. If it fails to do so, brush misalignment occurs.
STRETCH_ANDSCANS Windows 95/98: Same as BLACKONWHITE
STRETCH_DELETESCANS Windows 95/98: Same as COLORONCOLOR
STRETCH_HALFTONE Windows 95/98: Same as HALFTONE.
STRETCH_ORSCANS Windows 95/98: Same as WHITEONBLACK
WHITEONBLACK Performs a Boolean OR operation using the color values for the eliminated and existing pixels. If the bitmap is a monochrome bitmap, this mode preserves white pixels at the expense of black pixels.
Return Value
The previous stretching mode. It can be STRETCH_ANDSCANS, STRETCH_DELETESCANS, or STRETCH_ORSCANS.
Remarks
The bitmap-stretching mode defines how information is removed from bitmaps that are compressed by using the function.
The BLACKONWHITE (STRETCH_ANDSCANS) and WHITEONBLACK (STRETCH_ORSCANS) modes are typically used to preserve foreground pixels in monochrome bitmaps. The COLORONCOLOR (STRETCH_DELETESCANS) mode is typically used to preserve color in color bitmaps.
The HALFTONE mode requires more processing of the source image than the other three modes; it is slower than the others, but produces higher quality images. Also note that SetBrushOrgEx must be called after setting the HALFTONE mode to avoid brush misalignment.
Additional stretching modes might also be available depending on the capabilities of the device driver.
По выбору
StretchBlt()
StretchDIBits()
← →
mobila (2006-05-08 16:50) [11]Спасибо что разжевал, но вот в чём прикол когда я подставляю это в верхний пример и запускаю его то эффекта никакого, как была картинка чёткая, так и осталось.
Недавно нашёл пример как раз то что мне надо при уменьшении картинки она получается как в фотошопе чуть-чуть размазанная не чёткая, но не могу понять как соединить верхний пример и пример из хелпа D:\Program Files\Borland\Delphi7\Help\Examples\Jpeg\
Вот то что вырвал из примера в хелпе
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ExtDlgs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
OpenPictureDialog1: TOpenPictureDialog;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure SetJPEGOptions(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OpenFile(const Filename: string);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
USES Jpeg;
var
jpg: TJpegImage;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
OpenFile(OpenPictureDialog1.FileName);
end;
procedure TForm1.OpenFile(const Filename: string);
begin
try
Image1.Picture.LoadFromFile(Filename);
except
on EInvalidGraphic do
Image1.Picture.Graphic := nil;
end;
SetJPEGOptions(self);
end;
procedure TForm1.SetJPEGOptions(Sender: TObject);
begin
with TJPEGImage(Image1.Picture.Graphic) do
begin
Scale := TJPEGScale(Self);
end;
end;
end.
А вот то что надо соединить
procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBItmap;
jpg: TJpegImage;
scale: Double;
begin
if opendialog1.execute then
begin
jpg := TJpegImage.Create;
try
jpg.Loadfromfile( opendialog1.filename );
if jpg.Height > jpg.Width then
scale := 50 / jpg.Height
else
scale := 50 / jpg.Width;
bmp:= Tbitmap.Create;
try
{Create thumbnail bitmap, keep pictures aspect ratio}
bmp.Width := Round( jpg.Width * scale );
bmp.Height:= Round( jpg.Height * scale );
bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
{Draw thumbnail as control}
Self.Canvas.Draw( 100, 10, bmp );
{Convert back to JPEG and save to file}
jpg.Assign( bmp );
jpg.SaveToFile(ChangeFileext( opendialog1.filename, "_thumb.JPG" ));
finally
bmp.free;
end;
finally
jpg.free;
end;
end;
end;
Помогите кто может!!!
← →
programania © (2006-05-08 22:00) [12]Пример процедуры для уменьшения картинки
http://programania.com/stretch.zip 53кб
← →
mobila (2006-05-09 19:01) [13]Большое тебе спасибо!!! Хоть один человек выложил пример. Теперь буду совершенствовать свою программу.
← →
SamBrook © (2006-05-11 00:46) [14]
> mobila (06.05.06 11:58) [4]
> Эта книга для программирования на C/C++
> http://irazin.ru/Downloads/Books/Yuan.rar
Спасибо за ссылку, давно искал эту книгу
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.044 c