精华内容
下载资源
问答
  • 如何创建文字图片

    千次阅读 2016-08-10 15:59:09
    首先要搞明白,什么场景下会用到文字图片?在回答这个问题前,我们需要有个共识,所有的GDI函数都不能处理Alpha channel,除了AlphaBlend函数(但是这个函数只是从一个DC拷贝目的DC,并不能直接控制Alpha,需要通过...

    一次,同事向我请教如何创建文字图片的问题,我想因该是不难的,但是效果总是出不来,我俩为此用了一下午的时间来解决这个问题,后来在一篇外文上找到了解决方案,用它的一试,效果是出来了。问题是有几处关键的代码,我们弄不明白,资料又无从查起,这让我们很老火;都知道做技术的,对所在技术不明其理,那是不行的。 当然我们运气好,最终弄明白了那些代码的含义。归根结底,就是GDI API函数忽略了Alpha值的问题。借此总结下心得,以备自用。

    首先要搞明白,什么场景下会用到文字图片?在回答这个问题前,我们需要有个共识,所有的GDI函数都不能处理Alpha channel,除了AlphaBlend函数(但是这个函数只是从一个DC拷贝目的DC,并不能直接控制Alpha,需要通过CreateDIBSection函数创建一个带Alpha channel的HBITMAP,然后选到内存DC里去进行操作。),如果在内存DC里调用DrawText或TextOut绘制文本,那么他的alpha值就全是零。然后调用AlphaBlend函数,把内存DC复制到目的DC,就会导致文字区域显示透明,看不见。所以为了解决这个问题,我们就要用到文字图片,或者用GDI+绘制,GDI+没有Alpha的问题。

    HBITMAP CreateAlphaTextBitmap(LPCSTR inText, HFONT inFont, COLORREF inColour)
    { 
        int TextLength = (int)strlen(inText); 
        if (TextLength <= 0) return NULL; 
    
        // Create DC and select font into it 
        HDC hTextDC = CreateCompatibleDC(NULL); 
        HFONT hOldFont = (HFONT)SelectObject(hTextDC, inFont); 
        HBITMAP hMyDIB = NULL; 
    
        // Get text area 
        RECT TextArea = {0, 0, 0, 0}; 
        DrawText(hTextDC, inText, TextLength, &TextArea, DT_CALCRECT); 
        if ((TextArea.right > TextArea.left) && (TextArea.bottom > TextArea.top))
        { 
            BITMAPINFOHEADER BMIH; 
            memset(&BMIH, 0x0, sizeof(BITMAPINFOHEADER)); 
            void *pvBits = NULL; 
    
            // Specify DIB setup 
            BMIH.biSize = sizeof(BMIH); 
            BMIH.biWidth = TextArea.right - TextArea.left; 
            BMIH.biHeight = TextArea.bottom - TextArea.top; 
            BMIH.biPlanes = 1; 
            BMIH.biBitCount = 32; 
            BMIH.biCompression = BI_RGB; 
    
            // Create and select DIB into DC 
            hMyDIB = CreateDIBSection(hTextDC, (LPBITMAPINFO)&BMIH, 0, (LPVOID*)&pvBits, NULL, 0); 
            HBITMAP hOldBMP = (HBITMAP)SelectObject(hTextDC, hMyDIB); 
            if (hOldBMP != NULL)
            { 
                // Set up DC properties 
                SetTextColor(hTextDC, 0x00FF0000); 
                SetBkMode(hTextDC, TRANSPARENT); 
    
                // Draw text to buffer 
                DrawText(hTextDC, inText, TextLength, &TextArea, DT_NOCLIP); 
                BYTE* DataPtr = (BYTE*)pvBits; 
                BYTE FillR = GetRValue(inColour); 
                BYTE FillG = GetGValue(inColour); 
                BYTE FillB = GetBValue(inColour); 
                BYTE ThisA; 
                for (int LoopY = 0; LoopY < BMIH.biHeight; LoopY++) { 
                    for (int LoopX = 0; LoopX < BMIH.biWidth; LoopX++) { 
                        ThisA = *DataPtr; // Move alpha and pre-multiply with RGB 
                        *DataPtr++ = (FillB * ThisA) >> 8; 
                        *DataPtr++ = (FillG * ThisA) >> 8; 
                        *DataPtr++ = (FillR * ThisA) >> 8; 
                        *DataPtr++ = ThisA; // Set Alpha 
                    } 
                } 
    
                // De-select bitmap 
                SelectObject(hTextDC, hOldBMP); 
            } 
        } 
    
        // De-select font and destroy temp DC 
        SelectObject(hTextDC, hOldFont); 
        DeleteDC(hTextDC); 
    
        // Return DIBSection 
        return hMyDIB; 
    }
    void TestAlphaText(HDC inDC, int inX, int inY)
    { 
        const char *DemoText = "Hello World!\0"; 
        RECT TextArea = {0, 0, 0, 0}; 
        HFONT TempFont = CreateFont(50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Arial\0"); 
        HBITMAP MyBMP = CreateAlphaTextBitmap(DemoText, TempFont, 0xFF); 
        DeleteObject(TempFont); 
        if (MyBMP)
        {
            // Create temporary DC and select new Bitmap into it 
            HDC hTempDC = CreateCompatibleDC(inDC); 
            HBITMAP hOldBMP = (HBITMAP)SelectObject(hTempDC, MyBMP); 
            if (hOldBMP)
            {
                // Get Bitmap image size
                BITMAP BMInf;
                GetObject(MyBMP, sizeof(BITMAP), &BMInf); 
    
                // Fill blend function and blend new text to window 
                BLENDFUNCTION bf; 
                bf.BlendOp = AC_SRC_OVER; 
                bf.BlendFlags = 0; 
                bf.SourceConstantAlpha = 0x80; 
                bf.AlphaFormat = AC_SRC_ALPHA; 
                AlphaBlend(inDC, inX, inY, BMInf.bmWidth, BMInf.bmHeight, hTempDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf); 
    
                // Clean up 
                SelectObject(hTempDC, hOldBMP); 
                DeleteObject(MyBMP); 
                DeleteDC(hTempDC); 
            } 
        } 
    } 
    代码取至http://stackoverflow.com/questions/5309914/updatelayeredwindow-and-drawtext

    我们先来分析下CreateAlphaTextBitmap函数,这个函数功能是创建带alpha channel的文本,返回HBTIMAP。主流程是:

    1、首先创建内存DC、字体选到内存DC里、获取文本的区域;

    2、然后调用CreateDIBSection创建带有alpha通道的HBITMAP、把HBITMAP选进内存DC;然后调用SetTextColor设置文本的颜色,这里需要注意的是,这个颜色并不是最终

          绘制出来的颜色,最终的颜色是由inColour值决定。这里0x00FF0000值的顺序是ARGB,但是在内存的布局顺序是BGRA,这个认识很重要。接着因为不需要文字背景,所       以调用SetBkMode(hTextDC, TRANSPARENT);然后就是绘制文本

    3、最后改变每个像素的Alpha值、颜色值。先取出第一个字节的值保存下来,前面说过,在内存里的布局顺序BGRA,第一个字节是Blue,在像素扫描过程中,大部分时候Blue值都是0,只有经过文字区域时,Blue值是由之前设置的文本颜色0x00FF0000决定的,所以文本区域Blue是FF; 知道了这个理解起来就相当的容易了,接下来就是分别取出颜色值填充。


    然后就是TestAlphaText函数,这个函数很简单,就是调用CreateAlphaTextBitmap函数获取HBITMAP,然后把HBITMAP选进内存DC,最后调用AlphaBlend函数把文字图片画到指定的DC上去。


    效果图:


    展开全文
  • 在上一篇文章itextpdf基本使用中介绍了itextpdf开源库创建pdf的步骤和创建基本文本pdf的方法以及一些常用的设置,对这个开源库还不熟悉的朋友请到前面文章中了解下,今天介绍itext创建图片pdf的一...

    随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、可加微信技术交流群、QQ技术交流群(183198395)。

    在上一篇文章itextpdf基本使用中介绍了itextpdf开源库创建pdf的步骤和创建基本文本pdf的方法以及一些常用的设置,对这个开源库还不熟悉的朋友请到前面文章中了解下,今天介绍itext创建带图片pdf的一些基本方法。

    基本方法,创建带图片的pdf:

    	/**
    	 * 创建图片pdf示例
    	 * 
    	 * @param outPath
    	 * @throws IOException
    	 * @throws DocumentException
    	 */
    	public static void createImgPDF(String outPath) throws IOException, DocumentException {
    		File file = new File(outPath);
    		file.getParentFile().mkdirs();
    		Document document = new Document();
    		// 创建PdfWriter对象
    		PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outPath));
    		// 设置图片精确放置
    		writer.setStrictImageSequence(true);
    		// 打开文档
    		document.open();
    
    		// 添加本地图片
    		Image image1 = Image.getInstance(IMG1);
    		// 设置位置,以左下角为原点
    		image1.setAbsolutePosition(50f, 700f);
    		// 设置居中
    		image1.setAlignment(Image.MIDDLE);
    		// 设置居左
    		image1.setAlignment(Image.LEFT);
    		// 设置居右
    		image1.setAlignment(Image.RIGHT);
    		// 设置文字绕图形显示
    		image1.setAlignment(Image.TEXTWRAP);
    		// 设置图形作为文字的背景显示
    		image1.setAlignment(Image.UNDERLYING);
    		// 也可以综合上面使用
    		image1.setAlignment(Image.RIGHT | Image.TEXTWRAP);
    		// 按百分比缩放
    		image1.scalePercent(50);
    		// 根据宽高分别缩放
    		image1.scalePercent(50, 70);
    		// 设置到绝对大小
    		image1.scaleAbsolute(100, 100);
    		document.add(image1);
    
    		// 添加网络图片,设置同上
    		Image image2 = Image.getInstance(new URL(IMGURL));
    		document.add(image2);
    
    		// low level
    		PdfContentByte cb = writer.getDirectContent();
    		cb.fill();
    		cb.sanityCheck();
    
    		// 关闭文档
    		document.close();
    	}

    基本思路跟添加段落是一样的,上面代码有详细注释,支持本地路径和网络地址,可以设置图片大小、位置等等,添加图片的基本使用就是这样,下面列举几个itext官方比较实用的方法:

    1、对存在的pdf添加图片

    	/**
    	 * 在存在的pdf中添加图片
    	 * 
    	 * @param src
    	 * @param dest
    	 * @throws IOException
    	 * @throws DocumentException
    	 */
    	public static void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    		PdfReader reader = new PdfReader(src);
    		PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    		Image image = Image.getInstance(IMG1);
    		PdfImage stream = new PdfImage(image, "", null);
    		stream.put(new PdfName("ITXT_SpecialId"), new PdfName("123456789"));
    		PdfIndirectObject ref = stamper.getWriter().addToBody(stream);
    		image.setDirectReference(ref.getIndirectReference());
    		image.setAbsolutePosition(36, 400);
    		image.scaleAbsolute(100, 100);
    		PdfContentByte over = stamper.getOverContent(1);
    		over.addImage(image);
    		stamper.close();
    		reader.close();
    	}

    2、创建带水印的图片

    	/**
    	 * 创建带水印的PDF
    	 * 
    	 * @param dest
    	 * @throws IOException
    	 * @throws DocumentException
    	 */
    	public static void createWatermarkedPdf(String dest) throws IOException, DocumentException {
    		Document document = new Document();
    		PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    		document.open();
    		PdfContentByte cb = writer.getDirectContentUnder();
    		document.add(getWatermarkedImage(cb, Image.getInstance(IMG1), "watermark1"));
    		Image img = Image.getInstance(IMG2);
    		img.scaleToFit(100, 100);
    		document.add(getWatermarkedImage(cb, img, "watermark2"));
    		document.close();
    	}

    步骤跟添加图片一样,关键方法是生成带水印的图片:

    	/**
    	 * 生成水印图片
    	 * 
    	 * @param cb
    	 * @param img
    	 * @param watermark
    	 * @return
    	 * @throws DocumentException
    	 */
    	public static Image getWatermarkedImage(PdfContentByte cb, Image img, String watermark) throws DocumentException {
    		// 获取原图片的宽
    		float width = img.getScaledWidth();
    		// 获取原图片的高
    		float height = img.getScaledHeight();
    		// 创建模板
    		PdfTemplate template = cb.createTemplate(width, height);
    		// 添加图片
    		template.addImage(img, width, 0, 0, height, 0, 0);
    		// 设置文本以及位置、偏移、旋转
    		ColumnText.showTextAligned(template, Element.ALIGN_CENTER, new Phrase(watermark, FONT), width / 2, height / 2,
    				30);
    		Image newImage = Image.getInstance(template);
    		newImage.scaleAbsolute(100, 100);
    		return newImage;
    	}

    关于字体的设置在上一篇已经介绍,这里就不再重复了。效果如下:

    水印一般用白色,这里为了看起来明显就用的黑色。

    3、创建背景图

    	/**
    	 * 创建背景图
    	 * 
    	 * @param dest
    	 * @throws IOException
    	 * @throws DocumentException
    	 */
    	public static void createBackgroundPdf(String dest) throws IOException, DocumentException {
    		Document document = new Document(PageSize.A4.rotate());
    		PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    		document.open();
    		document.add(new Paragraph("大家好,这里是源代码社区!", FONT));
    		PdfContentByte canvas = writer.getDirectContentUnder();
    		Image image = Image.getInstance(BACKGROUD_IMG);
    		image.scaleAbsolute(PageSize.A4.rotate().getWidth(), PageSize.A4.rotate().getHeight());
    		image.setAbsolutePosition(0, 0);
    		canvas.addImage(image);
    		document.close();
    	}

    就是将图片大小设置为A4文档大小,从起点开始铺满整个页面,效果如下:

    还可以将背景设置半透明,弱化下背景效果:

    	/**
    	 * 创建半透明背景图
    	 * 
    	 * @param dest
    	 * @throws IOException
    	 * @throws DocumentException
    	 */
    	public static void createBackgroundTransparentPdf(String dest) throws IOException, DocumentException {
    		Document document = new Document(PageSize.A4.rotate());
    		PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    		document.open();
    		document.add(new Paragraph("大家好,这里是源代码社区!", FONT));
    		PdfContentByte canvas = writer.getDirectContentUnder();
    		Image image = Image.getInstance(BACKGROUD_IMG);
    		image.scaleAbsolute(PageSize.A4.rotate().getWidth(), PageSize.A4.rotate().getHeight());
    		image.setAbsolutePosition(0, 0);
    		canvas.saveState();
    		PdfGState state = new PdfGState();
    		state.setFillOpacity(0.6f);
    		canvas.setGState(state);
    		canvas.addImage(image);
    		canvas.restoreState();
    		document.close();
    	}

    效果如下:

    效果是不是弱了许多呢,上面介绍的一些方法都是非常实用的代码,当然这个库里面还有很多操作图片的功能,详细用法可以itextpdf官网看API。

    展开全文
  • 1.先创建一个图片 2.选中这个图片,选择Window窗口 3.打开window下的Animation 4.然后点击创建一个新的Animation动画文件 5.点击Add Property下的Image(script)下的Sprite,即创建了一个图片动画机 6.将...

    1.先创建一个UI--Image图片


    2.选中这个图片,选择Window窗口下的Animation


    3.然后点击创建一个新的Animation动画片段(会自动生成相应的动画机,名字为物体名)


    4.点击Add Property下的Image(script)下的Sprite,即创建了一个2D精灵图片帧动画


    5.将组成该动画的所有图片按照顺序拖到相应帧数处。最后保存,即创建成功静态图片的动画(第一个创建的是默认动画,可在动画状态机里做相应设置)。

    展开全文
  • 如何创建webp格式的图片

    千次阅读 2016-06-22 20:07:47
    Webp格式,是谷歌开发的一种旨在加快图片加载速度的图片格式.该格式的图片体积大约只有JPEG格式图片的2/3,并能节省大量的服务器宽带资源和数据空间.Facebook Ebay等知名网站已经测试并使用Webp格式. 但有一点是需要...

    首先说一下Webp是什么?

    Webp格式,是谷歌开发的一种旨在加快图片加载速度的图片格式.该格式的图片体积大约只有JPEG格式图片的2/3,并能节省大量的服务器宽带资源和数据空间.Facebook Ebay等知名网站已经测试并使用Webp格式.

    但有一点是需要注意的,那就是只有安卓4.0+才原生支持Webp,所以4.0以下的设备将无法看到图片.

    好了,下面说一下将jpg/png等格式的图片转成Webp格式的图片的流程:

    1.首先需要下载libwebp工具,并解压.

    2.将要转换格式的jpg/png/gif等格式的图片移动到解压文件的bin文件夹下.

    3.在bin文件夹中打开cmd.exe,将当前目录中的cwebp.exe文件拖动到cmd中,回车,会出现提示语句,按照提示语句进行操作即可.

    例如:要将当前目录中的1.jog进行转换,可在cmd中输入  cwebp -q 75 1.jpg -o 1.webp 然后回车,即在当前目录中生成1.webp文件.

    说明:75是指quality 质量.

    小伙伴们自己试一下,可以发现转换

    好了,以上与大家分享.


    展开全文
  • 这篇短文中,我们将探讨CALayer类,以及如何运用它来创建圆形图像或圆角图像。 您可能并没有听说过CALayer类。但是,如果你曾经创建过应用程序,那么你应该以某种方式使用过它。UIKit中的每个视图(例如UIView、...
  • 最近更新了android studio,一些原有的svg图片突然用不了了。一开始我以为我的android studio有问题,因为图片在android studio2.2.3并且在朋友的3.3版本下都是可以使用的,在多方调试下,还是没能找出原因所在,...
  • 用Windows 2000创建域并不难,在创建域之前需要做一些准备工作,首先必须满足以下条件:1. 必须安装了Windows 2000 Server、Windows 2000 Advance Server或者Windows 2000 DataCenter Server其中任何一种操作系统。2...
  • 在游戏制作的过程中,总会有特殊的...有了十张图片后,就可以通过设置每张图片所对应的ASCII码,生成一个png 和fnt的描述文件,在程序中去通过解析fnt数据源去png中找到对应纹理信息,创建纹理,显示出图片来。 ...
  • 图片懒加载现在已经算是一个被用烂了的技术了,但是对于刚接触的人,还是会遇到一些坑,本文记录一下此次项目...我的解决方法是:动态创建dom加在html这个单独写为一个方法createDom,触发图片懒加载是另外的方法laz...
  • 代码创建图片播放 #import "ViewController.h" #define kLength 15 @interface ViewController ()   @property(nonatomic, weak)UIImageView *myImage; @property(nonatomic, weak)UILabel *myLabel...
  • 方法一:用imageName加载图片的时候,实质上系统会把图片缓存到内存中去,如果图片较大或者图片较多的情况下用这张方法会消耗很大的内存,而且对于图片的内存释放也是一件非常复杂的事情,而对于同一张图片,只会...
  • 第一:创建好图标以后, 如何找连线呢? 大家只是看到只有这些: 这可怎么办呢? 怎么百度,谷歌都找不到,急的我都想放弃了。 然后又重新放到开头的那个图标上,想下该如何才能连线。 突然我看到光标的...
  • 通过xml文件创建shape来实现圆角矩形以及在res/drawable目录下创建图片背景选择器的方式这里就不用介绍,这里主要介绍如何通过代码来生成shape图形,以及生成图片背景选择器. 效果图: 图片展示的是一个FlowLayout,...
  • 一张图片用一个文件夹装,比如说有100张图片,就自动创建100个文件夹,每个文件夹装一张图片,这功能要怎么实现?
  • 如何在pb9中创建window窗口的标题前面加图片aaaaaaaaaaaaaaaaaaaaaaaaaaa
  • 今天遇到一个问题,就是背景图片要使用一个圆角矩形,而GUI没有提供现成的,只是提供了圆角矩形的两边和中间填充的图片,需要自己来建立这个图片(这样建立背景图片可以更灵活,一个GUI可以用在多个应用中,我想这是...
  • 我用OWC创建了图表,可是它默认的图表有黑色边框,该如何去掉?
  • 我想做一个画板,现在需要增加一个插入图片的功能。...目前我自定义了一个View来实现画线等功能,然后在MainActivity里创建了它,所以我不知道该怎么添加imageview来放置图片了,或者还有别的方法能实现?
  • 我们学校要求做一个c#的小程序,用c#连接word,在指定标签处添加文字后,我想在文字中间添加一个图片,但不知道怎么加,希望各位高手帮帮忙。下面是程序,我能找到的就这些,运行结果不是想要的。 using ...
  • 各位大神,现在我们项目利用vijava开发对接管理vcenter,请问利用vijava 创建主机时如何获取主机和vcenter server的证书验证,以及如何再添加主机时获取主机的信息。 参考vsphere clinet 截图 ![![图片说明]...
  • 创建与保存 1.根据一个文件路径创建Image对象 Image image = ImageIO.read(new File(filepath)); 2.将Image对象保存为文件形式 BufferedImage image = ImageIO.read(new File(filepath));//要想保存这个对象的话你...
  • 首先你必须要准备一个原图,和一个准备作为遮罩的掩码图(mask),这里有两点要注意,如果希望通过CGImageCreateWithMask函数去创建一个处理过的不规则的图片的话,那么你需要有一张原图是带alpha通道的图片,和一个...
  • 这篇文章主要介绍一下如何创建图片对应的类别的csv文件。 二、思路   首先在项目目录下创建一个名为IMAGE文件夹,将一些图片放入其中,图片名称最好有固定的命名规则(如图1)。之后通过代码获得图片路径,将所有...
  • 如何创建一个ContentHub exporter

    千次阅读 2015-08-19 16:59:33
    在以前的例子“利用ContentHub API来import图片”及“使用ContentHub来导入我们需要的照片”中,我们已经讲述了如何从别的应用中提取一个图片到我们的应用中。我们也在我们的另外一个文章“如何通过ContentHub把内容...
  • 基于mvc2架构下的验证码由一个controll中的action负责管理view上的一个动作,这是在controll中创建验证码图片的过程。 public FileResult ConfirmCode() { //生成4位随机数,并将其转为string型,传入session string...
  • 我用PHP imagecreatetruecolor生成了一个图片对像$im (当然还有一些详细的图片处理过程这里...那么请问,我如何直接将$im转成base64位的字符串,不需要直接显示图片(因为我要需要将这个base64字符串保存到数据库中)。
  • 4.那么,应该如何实现单击logo之后即可跳转到指定页面呢?下面仅以微博举例说明: 1)单击选中图片后,点击右上方的超链接按钮 2)在弹出窗口的地址栏中写上自己微博的首页地址,一路确定即可...
  • 分别对两张图像进行读入,可以把每张彩色图像存储为一个三维矩阵(width*...现在我想把这两张图片存入一个四维矩阵中(第四维是2),解决方法: I=imread('1.jpg');  J=imread('3.jpg'); %两幅图大小必须一样 K(:,
  • ArcGIS 如何创建标记符号

    千次阅读 2019-12-16 20:09:48
    ArcGIS(Version=10.1)创建标记符号有很多种,分别有 [x]3D 标记符号 [x]3D简单标记符号 [x]3D字符标记符号 [x]简单标记符号 [x]箭头标记符号 [x]图片标记符号 [x]字符标记符号 因为我要制作简单的字...
  • 更新后Android Studio如何创建shape AS更新以后不能直接从drawable目录下创建根元素为shape等类型的xml文件,需要从上一级目录进行添加,下面以图片的形式展示。 就是这么简单。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,259
精华内容 12,903
关键字:

如何创建图片