| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2158 人关注过本帖, 2 人收藏
标题:请教用gdi+如何修改图片大小?
只看楼主 加入收藏
wxzd123
Rank: 2
等 级:论坛游民
帖 子:333
专家分:58
注 册:2012-9-6
结帖率:88.1%
收藏(2)
已结贴  问题点数:20 回复次数:13 
请教用gdi+如何修改图片大小?
请教用gdi+如何修改图片大小?最好发个示例,谢谢

[此贴子已经被作者于2022-5-9 07:58编辑过]

搜索更多相关主题的帖子: 大小 修改 示例 gdi 图片 
2022-05-09 07:56
sych
Rank: 4
等 级:业余侠客
威 望:7
帖 子:243
专家分:290
注 册:2019-10-11
收藏(2)
得分:5 
*用来改变现有图像的尺寸
*******************************************
*算法制作:行者孙(QQ:310727570)
*******************************************
*VFP应用程式算法群:12787940
*******************************************
FUNCTION resizeimage(pSourceFileNAme as String,pNewFileNAme as String,nWidth as Long,nHeight as long)
PRIVATE pSourceFileNAme,pNewFileNAme,nWidth,nHeight
DECLARE INTEGER GdiplusStartup IN gdiplus;
   INTEGER @token, STRING @INPUT, INTEGER OUTPUT
DECLARE INTEGER GdipSaveImageToFile IN gdiplus.DLL ;
   INTEGER nImage, STRING wFilename, STRING qEncoder, INTEGER nEncoderParamsPtr
DECLARE INTEGER GdipLoadImageFromFile IN gdiplus.DLL ;
   STRING wFilename, INTEGER @nImage
DECLARE INTEGER GdipGetImageGraphicsContext IN gdiplus.DLL ;
   INTEGER nImage, INTEGER @ nGraphics
DECLARE INTEGER GdipCreateBitmapFromScan0 IN gdiplus.DLL ;
   INTEGER nWidth, INTEGER nHeight, INTEGER nStride;
   , INTEGER nPixelFormat ;
   , STRING @ cScan0, INTEGER @ nImage
DECLARE INTEGER GdipDrawImageRect IN gdiplus.DLL ;
   INTEGER nGraphics, INTEGER nImage, SINGLE,SINGLE,SINGLE,SINGLE
DECLARE INTEGER CLSIDFromString IN ole32 STRING lpsz, STRING @pclsid
DECLARE INTEGER GdiplusShutdown IN gdiplus INTEGER token
DECLARE integer GdipDisposeImage IN gdiplus  long

 

LOCAL hToken, cInput
hToken = 0
cInput = PADR(CHR(1), 16, CHR(0))
GdiplusStartup(@hToken, @cInput, 0)

LOCAL nImage
nImage = 0
GdipLoadImageFromFile(STRCONV(pSourceFileNAme + CHR(0), 5), @nImage)
#DEFINE   GDIPLUS_PIXELFORMAT_32bppARGB          0x0026200A

LOCAL nBitmap, nWidth, nHeight, nX, nY
nBitmap = 0
nX = 0
nY = 0
GdipCreateBitmapFromScan0(nWidth, nHeight, 0, GDIPLUS_PIXELFORMAT_32bppARGB, 0, @nBitmap)

LOCAL nGraphics
nGraphics = 0
GdipGetImageGraphicsContext (nBitmap, @nGraphics)

GdipDrawImageRect(nGraphics, nImage, nX, nY, nWidth, nHeight)
LOCAL lcEncoder
lcEncoder = REPLICATE(CHR(0),16)

*CLSIDFromString(STRCONV("{557CF401-1A04-11D3-9A73-0000F81EF32E}" + CHR(0), 5), @lcEncoder)

ERASE (pNewFileNAme)
*GdipSaveImageToFile (nBitmap, STRCONV(pNewFileNAme,5) + CHR(0), lcEncoder, 0)
GdipSaveImageToFile (nBitmap, STRCONV(pNewFileNAme,5) + CHR(0), 0h00F47C55041AD3119A730000F81EF32E, 0)
GdipDisposeImage(@nImage)


GdiplusShutdown(hToken)

 

CLEAR DLLS
ENDFUNC
2022-05-09 08:33
zhken
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:283
专家分:616
注 册:2012-9-21
收藏
得分:5 
回复 楼主 wxzd123
*
_gdiplus.zip (59.06 KB)
解压此文件到当前目录 引用前辈的解法。  需要 _gdiplus 文件支持  需要源图片文件 D:\TEST.jpg

PUBLIC oform1

oform1=NEWOBJECT("form1")
oform1.Show
RETURN


    **************************************************
*-- Form:         form1 (c:\users\administrator\documents\visual foxpro 项目\suofang.scx)
*-- 父类:  form
*-- 基类:    form
*-- 时间戳:   05/11/22 12:12:08 AM
*
DEFINE CLASS form1 AS form


    Top = 122
    Left = 400
    Height = 266
    Width = 400
    ShowWindow = 2
    DoCreate = .T.
    Caption = "Form1"
    WindowState = 0
    Name = "Form1"


    ADD OBJECT text3 AS textbox WITH ;
        FontSize = 12, ;
        Alignment = 3, ;
        Value = 120, ;
        Height = 24, ;
        Left = 108, ;
        Top = 60, ;
        Width = 100, ;
        Name = "Text3"


    ADD OBJECT text4 AS textbox WITH ;
        FontSize = 12, ;
        Alignment = 3, ;
        Value = 120, ;
        Height = 24, ;
        Left = 108, ;
        Top = 84, ;
        Width = 100, ;
        Name = "Text4"


    ADD OBJECT text5 AS textbox WITH ;
        FontSize = 12, ;
        Alignment = 3, ;
        Value = 72, ;
        Height = 24, ;
        Left = 108, ;
        Top = 120, ;
        Width = 100, ;
        Name = "Text5"


    ADD OBJECT command1 AS commandbutton WITH ;
        Top = 156, ;
        Left = 108, ;
        Height = 25, ;
        Width = 96, ;
        FontSize = 12, ;
        Caption = "开始转换", ;
        Name = "Command1"


    ADD OBJECT label1 AS label WITH ;
        AutoSize = .T., ;
        FontSize = 12, ;
        BackStyle = 0, ;
        Caption = "长", ;
        Height = 20, ;
        Left = 60, ;
        Top = 60, ;
        Width = 18, ;
        Name = "Label1"


    ADD OBJECT label2 AS label WITH ;
        AutoSize = .T., ;
        FontSize = 12, ;
        BackStyle = 0, ;
        Caption = "宽", ;
        Height = 20, ;
        Left = 60, ;
        Top = 84, ;
        Width = 18, ;
        Name = "Label2"


    ADD OBJECT label3 AS label WITH ;
        AutoSize = .T., ;
        FontSize = 12, ;
        BackStyle = 0, ;
        Caption = "分辨率", ;
        Height = 20, ;
        Left = 36, ;
        Top = 120, ;
        Width = 50, ;
        Name = "Label3"


    ADD OBJECT image2 AS image WITH ;
        Height = 84, ;
        Left = 228, ;
        Top = 60, ;
        Width = 108, ;
        Name = "Image2"


    PROCEDURE Load
         
    ENDPROC


    PROCEDURE Unload
         
    ENDPROC


    PROCEDURE command1.Click
        Local lcFile_S, lcFile_T, lnW_T, lnH_T, lnXDpi_T, lnYDpi_T
        m.lcFile_S = 'D:\TEST.jpg'
        m.lcFile_T = 'D:\TEST1.jpg'

        IF FILE(m.lcFile_T)

        ELSE
        =MESSAGEBOX('D:\TEST1.jpg此文件不存在。',0,'转换')
        RETURN .f.
        ENDIF


        m.lnW_T = THISFORM.TEXT3.VALUE      && 目标图宽、高度
        m.lnH_T = THISFORM.TEXT4.VALUE
        m.lnXDpi_T = THISFORM.TEXT5.VALUE     && 目标图分辨率
        m.lnYDpi_T = THISFORM.TEXT5.VALUE
        Set Classlib To "_GDIPlus.Vcx" Additive
        oGraphics=CreateObject("gpGraphics")      && 创建工作图像
        oImage=CreateObject("gpImage")            && 源图
        oImage.CreateFromFile(m.lcFile_S)         && 从源图创建
        m.lnW = oImage.ImageWidth                 && 宽
        m.lnH = oImage.ImageHeight                && 高
        m.lnXDpi = oImage.HorizontalResolution    && 水平分辨率
        m.lnYDpi = oImage.VerticalResolution      && 垂直分辨率
        oBitMap=CreateObject("gpBitMap")          && 目标图
        oBitMap.Create(m.lnW_T, m.lnH_T)          && 按目标图大小创建
        oGraphics.CreateFromImage(oBitMap)               && 工作图像按目标图建立
        oBitMap.SetResolution(m.lnXDpi_T, m.lnYDpi_T)    && 设置目标图分辨率
        oGraphics.DrawImageScaled(oImage, 0, 0, m.lnW_T, m.lnH_T)    && 源图按指定矩形区域缩放
        m.lnQuality = 90  && 100                  && 图片保存质量
        oBitMap.SaveToFile(m.lcFile_T, oImage.GetEncoderCLSID("image/jpeg"), "quality="+Transform(m.lnQuality))    && 按源文件类型保存至目标文件
        Release oBitMap    && 释放
        Release oImage
        Release oGraphics
        Release Classlib _GdiPlus


        IF FILE(m.lcFile_T)
        thisform.image2.Picture=m.lcFile_T
        =MESSAGEBOX('转换成功',0,'转换成功')
        ELSE
        =MESSAGEBOX('转换不成功',0,'转换不成功')
        ENDIF
    ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************
2022-05-11 00:22
wxzd123
Rank: 2
等 级:论坛游民
帖 子:333
专家分:58
注 册:2012-9-6
收藏
得分:0 
谢谢
原图
图片附件: 游客没有浏览图片的权限,请 登录注册

转换后
图片附件: 游客没有浏览图片的权限,请 登录注册
2022-05-11 06:18
wxzd123
Rank: 2
等 级:论坛游民
帖 子:333
专家分:58
注 册:2012-9-6
收藏
得分:0 
右边和下边线少了
2022-05-11 06:19
wxzd123
Rank: 2
等 级:论坛游民
帖 子:333
专家分:58
注 册:2012-9-6
收藏
得分:0 
使用MyFll.Fll转换也是这个问题
2022-05-11 06:23
sych
Rank: 4
等 级:业余侠客
威 望:7
帖 子:243
专家分:290
注 册:2019-10-11
收藏
得分:0 
100缩放到10,一定丢失了90,如果原来的只有1,再缩放到1%,丢是一定的啦
2022-05-11 08:22
my2318
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:253
专家分:630
注 册:2014-3-18
收藏
得分:5 
缩小丢失细节是算法问题,如果采用像素块rgb的平均值作为新像素的rgb值就可解决这一问题,个人看法,不一定对٩(๑^o^๑)۶
2022-05-11 10:25
wxzd123
Rank: 2
等 级:论坛游民
帖 子:333
专家分:58
注 册:2012-9-6
收藏
得分:0 
有没有高手能解决这个问题?
2022-05-12 06:46
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:5 
以下是引用wxzd123在2022-5-12 06:46:34的发言:
有没有高手能解决这个问题?


好吧,我承认:
我是高手,不小心泄露身份啦。
哈哈哈哈。
其实我用的是专业图像处理软件Photoshop CC(正版价格印象中是2975元)。
PS代表最专业、最正规的图像处理算法……
好吧,Photoshop将350x350像素的图片,自动缩小至40x40,肯定需要借助全宇宙最最最最先进的插值算法,删除掉将近90%的图片像素,那么,图像线条必定是有损的。
再专业、再高手也必然如此。
这问题其实跟“高手、低手”无关。
我只能说:
楼主,我觉得吧,你有必要稍稍学习一点点计算机图像处理方面的知识——哪怕是皮毛知识,也不必太专业那种。
因为楼主这个问题问得相当业余,相当无畏那种。
呵呵。
2022-05-12 16:03
快速回复:请教用gdi+如何修改图片大小?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017409 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved