Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизAlphaBlend: наложить bmp на jpg или наоборот Найти похожие ветки
← →
fredwriter © (2012-09-17 16:58) [0]Здравствуйте, делаю лабу, нужно наложить одно изображение на другое, для этого используется Alpha-наложение при помощи API AlphaBlend. Если выбирается jpg, то я преобразую jpg в bmp и пытаюсь наложить. Если оба выбранных изображения bmp, или оба jpg, то всё накладывается отлично, если одно jpg, а другое bmp, то GetLastError с кодом 87(неверно задан параметр). Понятно, что я как-то недопреобразовал jpg, но информации о том, как правильно сделать не нашел.
Может найдется добрый дядя, который мне поможет?
Вот код:procedure TForm1.Button1Click(Sender: TObject);
var
bmp1, bmp2: TBitMap;
jpg1, jpg2: TJpegImage;
Blend: TBlendFunction;
i, j: integer;
s1, s2: string;
begin
jpg1 := TJpegImage.Create;
jpg2 := TJpegImage.Create;
bmp1 := TBitMap.Create;
bmp2 := TBitMap.Create;
try
i := pos(".", edit1.Text);
j := pos(".", edit2.Text);
s1 := Copy(edit1.text, i + 1, 3);
s2 := Copy(edit2.text, j + 1, 3);
if ((s1 = "jpg") or (s1 = "jpeg")) and ((s2 = "jpg") or (s2 = "jpeg")) then //если оба jpg
begin
jpg1:=TJPEGImage.Create;
bmp1:=TBitmap.Create;
jpg1.CompressionQuality:=100;
jpg1.Compress;
jpg1.LoadFromFile(Edit1.Text);
bmp1.Assign(jpg1);
jpg2:=TJPEGImage.Create;
bmp2:=TBitmap.Create;
jpg2.CompressionQuality:=100;
jpg2.Compress;
jpg2.LoadFromFile(Edit2.Text);
bmp2.Assign(jpg2);
end;
if ((s1 = "jpg") or (s1 = "jpeg")) and (s2 = "bmp") then //если первый jpg, а второй bmp
begin
jpg1:=TJPEGImage.Create;
bmp1:=TBitmap.Create;
jpg1.CompressionQuality:=100;
jpg1.Compress;
jpg1.LoadFromFile(Edit1.Text);
bmp1.Assign(jpg1);
end;
if ((s2 = "jpg") or (s2 = "jpeg")) and (s1 = "bmp") then //если первый bmp, а второй jpg
begin
jpg2:=TJPEGImage.Create;
bmp2:=TBitmap.Create;
jpg2.CompressionQuality:=100;
jpg2.Compress;
jpg2.LoadFromFile(Edit2.Text);
bmp2.Assign(jpg2);
end;
if (s1 = "bmp") and (s2 = "bmp") then //если оба bmp
begin
bmp1.LoadFromFile(Edit1.Text);
bmp2.LoadFromFile(Edit1.Text);
end;
bmp1.PixelFormat := pf32bit;
bmp2.PixelFormat := pf32bit;
Blend.BlendOp := AC_SRC_OVER;
Blend.BlendFlags := 0;
Blend.SourceConstantAlpha := ScrollBar1.Position;
Blend.AlphaFormat := AC_SRC_ALPHA;
if Windows.AlphaBlend(bmp1.Canvas.Handle, 0, 0, bmp1.Width, bmp1.Height,
bmp2.Canvas.Handle, 0, 0, bmp2.Width, bmp2.Height, Blend) then
image1.Canvas.Draw(0, 0, bmp1)
else
ShowMessage(IntToStr(GetLastError));
bmp1.Free;
bmp2.Free;
except
ShowMessage("Не удалось выполнить наложение, проверьте правильность путей" + #10#13 + "для выбранных изображений");
end;
end;
← →
antonn © (2012-09-17 17:52) [1]
> i := pos(".", edit1.Text);
> j := pos(".", edit2.Text);
> s1 := Copy(edit1.text, i + 1, 3);
> s2 := Copy(edit2.text, j + 1, 3);
extractfilext(), и не забыть про регистр.
разбирать условия лень, могу показать это http://forum.sources.ru/index.php?showtopic=332418&view=findpost&p=2903423 , мож пригодится.
вообще тут двух условий (на каждый битмап свое) или функции типа этой хватит:Procedure Load_Bitmap(s:string; var Image:TBitmap);
var jpeg:TJPEGImage; bmp:TBitmap;
begin
if not(fileexists(s)) then exit;
if lowercase(extractfileext(s))=".bmp" then begin
Image.LoadFromFile(s);
end else begin
jpeg := TJPEGImage.Create;
try
jpeg.CompressionQuality:=100;
jpeg.LoadFromFile(s);
bmp:=TBitmap.Create;
try
bmp.Assign(jpeg);
image.Assign(bmp);
finally
bmp.Free
end;
finally
jpeg.Free
end;
end;
end;
← →
брат Птибурдукова (2012-09-18 09:55) [2]
> s2 := Copy(edit2.text, j + 1, 3); if ((s1 = "jpg")
> or (s1 = "jpeg")) and ((s2 = "jpg") or (s2 = "jpeg")) then
> //если оба jpg
Как же ты, скопировав три символа, надеешься получить строку "jpeg"? И почему ты считаешь, что в пути не может быть точки, а обязательно точка отделяет имя от расширения? Читай про ExtractFileExt.
> if ((s1 = "jpg") or (s1 = "jpeg")) and (s2 = "bmp") then
> //если первый jpg, а второй bmp begin jpg1:=TJPEGImage.
> Create; bmp1:=TBitmap.Create; jpg1.CompressionQuality:
> =100; jpg1.Compress; jpg1.LoadFromFile(Edit1.Text);
> bmp1.Assign(jpg1); end;
А в Bmp2 у тебя остаётся пустота, так что "наложение не приводит ни к чему. А уничтожать Jpg1 кто будет? А нахрена ты ещё раз создал bmp1? Ну и про try finally почитай.
ЗЫ. Если программа как-то работает, это совсем не означает, что она работает правильно.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.072 c